我的问题可能被标记为重复,但经过大量解决方案后,我仍然无法弄清楚我哪里出错了。请帮忙。
我的图片名称是“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);
有额外的 \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/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |