OStack程序员社区-中国程序员成长平台

标题: ios - 如何在服务器上上传png类型的图像 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 10:40
标题: ios - 如何在服务器上上传png类型的图像

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

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

////创建请求 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; NSURL* requestURL = [NSURL URLWithString"http://....."]; [请求设置 URL:requestURL]; [请求 setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; [请求设置HTTPShouldHandleCookies:NO]; [请求 setTimeoutInterval:30]; [请求 setHTTPMethod"POST"]; NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy"; NSString *filename = @"image"; //在 HTTP 头中设置 Content-Type NSString *contentType = [NSString stringWithFormat"multipart/form-data; 边界=%@", BoundaryConstant]; [请求 setValue:contentType forHTTPHeaderField"Content-Type"]; //发布正文 NSMutableData *body = [NSMutableData 数据]; //添加图片数据 NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed"image.png"]); 如果(图像数据){ [body appendData:[[NSString stringWithFormat"\r\n--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [正文 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]]; [正文 appendData:[NSData dataWithData:imageData]]; [正文 appendData:[[NSString stringWithFormat"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } [body appendData:[[NSString stringWithFormat"\r\n--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; //将帖子的正文设置为请求 [请求 setHTTPBody:body]; //设置内容长度 NSString *postLength = [NSString stringWithFormat"%lu", (unsigned long)[body length]]; [请求 setValue:postLength forHTTPHeaderField:@"Content-Length"]; //设置网址 [请求设置 URL:requestURL]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returnedResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"Ret: %@",returnString);



Best Answer-推荐答案


有额外的 \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. 您将 nil 用于 responseerror 对象。如果您这样做,那么您可以执行的诊断将受到极大限制。你在瞎飞。应始终检查生成的 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4