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

时间:2015-04-15 11:20:50

标签: ios

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

我的图片名称为' 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);

1 个答案:

答案 0 :(得分:4)

还有额外的\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标题。

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

  5. 您对nilresponse个对象使用error。如果这样做,那么您可以执行的诊断非常有限。你是盲目的。应始终检查生成的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

相关问题