gpt4 book ai didi

ios - 如何在服务器上上传png类型的图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:41:01 24 4
gpt4 key购买 nike

我的问题可能被标记为重复,但在经过大量解决方案后,我仍然无法弄清楚我哪里出错了。请帮忙。

我的图片名称是“image.png”。请指定 BoundaryConstant 中应包含的内容。我刚刚从某个网站复制了它。

// // create request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSURL* requestURL = [NSURL URLWithString:@"http://....."];
[request setURL:requestURL];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"POST"];
NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
NSString *filename = @"image";
// set Content-Type in HTTP header
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];

// post body
NSMutableData *body = [NSMutableData data];

// add image data
NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"image.png"]);
if (imageData) {
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.png\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

// set URL
[request setURL:requestURL];

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

NSLog(@"Ret: %@",returnString);

最佳答案

有额外的 \r\n 字符(参见下面的第 2 点),但其他方面看起来没问题。在没有看到服务器代码、NSURLResponse 对象或 NSError 对象的情况下,我们无法诊断可能出了什么问题。

一些细节:

  1. 我不会在边界的开头包含破折号。如果不出意外,这真的很难区分前导 -- 和实际边界。

  2. 您在边界之前写了一个额外的 \r\n。我会替换

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

    并替换

    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

    原样(特别是,在您添加图像数据的地方,一个 \r\n,然后是 \r\n--%@--\r\n),您将在上传图像的末尾添加额外的两个字节(即 \r\n)。这通常不会导致问题(图像通常仍然有效),但它是不正确的。

  3. 您通常不必设置 Content-Length header 。

  4. 不要使用同步请求。使用 sendAsynchronousRequest

  5. 您正在为 responseerror 对象使用 nil。如果您这样做,那么您可以执行的诊断将非常有限。你在盲目飞行。人们应该始终检查生成的 NSURLResponseNSError 对象。

  6. 如果不查看服务器代码,我们无法判断此上传是否有效。特别是,我发现您使用名为 filename 且值为 image 的变量作为字段的 name 有点令人困惑。但是,如果您在服务器上的 $_FILES(或者如果不使用 PHP,则它正在寻找的任何字段名称)正在寻找 image,那很好。这只是变量名的混淆/误导性选择。我可能会将该变量称为 fieldName 或类似名称。

    最重要的是,$_FILES 是否正在寻找名为 image 的字段名称?

  7. 你有一行内容是:

    [body appendData:[NSData dataWithData:imageData]];

    那可能只是:

    [body appendData:imageData];

    无需创建新的 NSData

  8. 我会删除对 setURL 的第二次调用。没必要。

  9. 您正在加载 image.png,将其转换为 UIImage,然后使用 UIImagePNGRepresentation 获取 NSData。这可以工作但效率很低。只需将文件的内容直接加载到 NSData 中,完全绕过 UIImage

    此外,如果找不到图像,我建议您记录一条错误消息。现在,它会简单地跳过添加图像的步骤(这意味着它会静默发送请求,不会告诉您是否有问题)。

  10. 您应该在类似 Charles 的工具中查看此请求.如果您打算在准备请求时获得这种级别的详细信息,您应该在请求发出时检查它们。

  11. 我建议你只使用像 AFNetworking 这样的东西这会让你摆脱这些杂草。如果您想自己执行此操作,请参阅 https://stackoverflow.com/a/24252378/1271826 .

关于ios - 如何在服务器上上传png类型的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29648857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com