【问题标题】:Add Post data to Image Upload将 Post 数据添加到图像上传
【发布时间】:2023-03-20 01:44:01
【问题描述】:

我使用this answerthis question 中的代码将我的iPhone 应用程序中的图像发布到网站上的php 页面。本质上,代码会创建正确格式的 html 流并提交它。

为了完整起见,我已经重新发布了代码。

- (BOOL)uploadImage:(NSData *)imageData filename:(NSString *)filename{


    NSString *urlString = @"http://www.yourdomainName.com/yourPHPPage.php";

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];

    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:body];

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

    return ([returnString isEqualToString:@"OK"]);
}

但是我不够聪明 :( 来弄清楚如何添加通用字段值,例如。我想添加一个评论字段以与图像文件一起提交。

关于如何修改该代码以向 POST 表单添加多个字段的任何建议。

谢谢。

更新:我可以通过修改我发布的 URL 以包含 GET 参数来使其工作,但我宁愿使用所有发布参数。

【问题讨论】:

    标签: iphone html objective-c


    【解决方案1】:

    这并不难。多部分/表单数据帖子的一般格式如下:

    --boundary-string
    Content-Disposition: form-data; name="field1"
    
    value1
    --boundary-string
    Content-Disposition: form-data; name="field2"
    
    value2
    --boundary-string--
    

    文件上传是一种特殊情况,但您已经处理好了。要添加另一个字段,您只需添加另一个块。应该这样做:

    NSMutableData *body = [NSMutableData data];
    
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Comment\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[comment dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\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--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:body];
    

    顺便说一句,你几乎不需要调用 NSString 的 stringWithString: 方法。如果您需要副本,请致电copy,否则请使用您已有的字符串。不过,NSMutableString 的 stringWithString: 可以用作 [[string mutableCopy] autorelease] 的替代品。

    【讨论】:

      【解决方案2】:

      首先你应该使用 NSMutableURLRequest 对象的addValue:forHTTPHeaderField: 方法来添加标题。例如

      [request addValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];
      [request addValue:[NSString stringWithFormat:@"form-data; name=\"userfile\"; filename=\"%@\"",filename] forHTTPHeaderField:@"Content-Disposition"];
      ...
      

      在您的代码中设置完所有标题后,您应该使用下面的代码设置 POST 数据。

      NSMutableData *body = [[NSMutableData alloc] init];
      [body appendData:[[NSString stringWithString:@"name=myimagename.png"] dataUsingEncoding:NSUTF8StringEncoding]];
      [body appendData:[[NSString stringWithString:@"&data="] dataUsingEncoding:NSUTF8StringEncoding]];
      [body appendData:[NSData dataWithData:imageData]];
      [body release];
      [request setHTTPBody:body];
      

      但是当且仅当服务器支持这种格式时它才会起作用(我的意思是 data=image binary data&name=image name)。

      【讨论】:

      • 您似乎不了解 HTTP 文件上传的工作原理。大多数服务器(例如用 PHP 完成的一切)都需要 multipart/form-data 而不是 application/x-www-form-urlencoded。如果图像数据恰好包含 0x26 字节,您的示例代码将失败。
      • @Anomie:你是对的!根据 rfc1867 我的回答是错误的。我为不正确的答案道歉。请减去它。
      【解决方案3】:

      我建议使用ASIHttp。见ASIFormDataRequest

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 2012-03-02
        • 1970-01-01
        • 2019-03-15
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 2016-08-28
        相关资源
        最近更新 更多