我的问题可能被标记为重复,但经过大量解决方案后,我仍然无法弄清楚我哪里出错了。请帮忙。
我的图片名称是“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-推荐答案 strong>
有额外的 \r\n 字符(参见下面的第 2 点),但其他方面看起来还不错。如果没有看到服务器代码,也没有看到 NSURLResponse 对象,也没有看到 NSError 对象,我们无法诊断出可能出了什么问题。
一些细节:
我不会在边界的开头添加破折号。如果不出意外,很难将前导 -- 与实际边界区分开来。
你在边界之前写了一个额外的\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 )。这通常不会导致问题(图像通常仍然有效),但它不正确。
一般不需要设置Content-Length header 。
不要使用同步请求。使用 sendAsynchronousRequest 。
您将 nil 用于 response 和 error 对象。如果您这样做,那么您可以执行的诊断将受到极大限制。你在瞎飞。应始终检查生成的 NSURLResponse 和 NSError 对象。
如果不查看服务器代码,我们无法判断此上传是否可行。特别是,我发现您使用名为 filename 且值为 image 的变量作为字段的 name 有点令人困惑。但是,如果您在服务器上的 $_FILES (或者如果不使用 PHP,无论它正在寻找什么字段名称)正在寻找 image ,那很好。这只是变量名的混淆/误导性选择。我可能会称该变量为 fieldName 或类似的名称。
最重要的是,$_FILES 是否在寻找名为 image 的字段名称?
你有一行说:
[body appendData:[NSData dataWithData:imageData]];
可能只是:
[body appendData:imageData];
无需创建新的NSData 。
我将删除对 setURL 的第二次调用。没必要。
您正在加载 image.png ,将其转换为 UIImage ,然后使用 UIImagePNGRepresentation 获取 NSData 。这可以工作,但效率非常低。直接将文件内容加载到NSData ,完全绕过UIImage 。
另外,如果找不到图像,我建议您记录错误消息。现在,它会简单地跳过添加图像的步骤(意味着它会静默发送请求,不会告诉你是否有问题)。
您应该在 Charles 之类的工具中查看此请求.如果您要在准备请求时了解此级别的详细信息,则应在请求发出时对其进行检查。
我建议你只使用 AFNetworking 之类的东西它可以让你摆脱这些杂草。如果您想自己执行此操作,请参阅 https://stackoverflow.com/a/24252378/1271826 .
关于ios - 如何在服务器上上传png类型的图像,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/29648857/
|