【问题标题】:iOS Upload multiple files at onceiOS一次上传多个文件
【发布时间】:2012-07-02 15:30:05
【问题描述】:

是否可以在一个请求中上传两个(或多个)文件??

我一直在尝试使用 NSMutableURLRequest 和 NSURLConnection 这样做,但到目前为止没有成功,我在网上也没有找到令人信服的答案。

上传单个文件很容易(使用来自 here 的代码),但 HTML Specs 提到,当上传多个文件时,您必须在 multipart/form-data 中嵌入一个 multipart/mixed 标头,并且要在该多部分/混合标头中上传的文件。

上面链接代码的问题在于,正在上传的一个文件的 Content-Disposition 设置为“form-data”(我猜这意味着单个文件是表单数据的“全部”?)我认为“没有空间”可以附加另一个文件。如果我错了,请纠正我。

谢谢。

【问题讨论】:

    标签: ios5 file-upload nsmutableurlrequest


    【解决方案1】:

    编辑:

    您上传的文件数据应使用 Base64 编码;你可以通过NSData+Base64 做到这一点,然后使用:

    [body appendData:[imageData1 base64EncodedString];
    

    发送文件数据,我假设imageData1被定义为:

    NSData* imageData = UIImagePNGRepresentation(image);
    

    imageUIImage

    旧答案:

    这是来自HTML 4.0.1 standard(文档最后)的示例:

    Content-Type: multipart/form-data; boundary=AaB03x
    
    --AaB03x
    Content-Disposition: form-data; name="submit-name"
    
    Larry
    --AaB03x
    Content-Disposition: form-data; name="files"
    Content-Type: multipart/mixed; boundary=BbC04y
    
    --BbC04y
    Content-Disposition: file; filename="file1.txt"
    Content-Type: text/plain
    
    ... contents of file1.txt ...
    --BbC04y
    Content-Disposition: file; filename="file2.gif"
    Content-Type: image/gif
    Content-Transfer-Encoding: binary
    
    ...contents of file2.gif...
    --BbC04y--
    --AaB03x--
    

    请注意,这些文件一起列在一个多部分/混合列表中。

    所以你可以试试代码:

    //-- new part in multipart/form-data
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Disposition: form-data; name=\"files\" dataUsingEncoding:NSUTF8StringEncoding]];
    
    //-- new multipart/mixed
    [body appendData:[[NSString stringWithFormat:@"multipart/mixed; boundary=%@", mixedBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: file; filename=\"%@\"\r\n", FileParamConstant1] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData1];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", mixedBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: file; filename=\"%@\"\r\n", FileParamConstant2] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData2];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    

    注意更改 filenamename 属性,它应该可以工作。

    【讨论】:

    • 我已经尝试过了,在使用 Charles Web 代理检查请求后,我只看到附加了第一个参数。我尝试了很多不同的方法来做到这一点,只有发送的第一个参数似乎附加到请求中。我也找不到任何资源详细说明这是否可以完成。
    • 感谢您的时间 sergio,但我已经尝试了几乎与您发布的代码完全相同的代码。用查尔斯检查请求我发现只有一个“文件”参数(根据规范这似乎是正确的)但里面没有文件。该参数包括一些请求的正文,导致我认为某处存在语法错误,但我找不到任何东西......也许我会放弃它并使用 nsqueue 或 GCD 发送两个请求跨度>
    • 不客气。您是否还检查了哪些数据离开了您的机器? body 应该原封不动地到达代理(在到达 Web 服务器之前语法不应该有任何区别)......最后它只是你发送的一个大字符串......只有一件事,你在使用 Base64为文件内容编码?
    • 我真的不知道,但我猜它使用的是 base64 ......我应该将它设置在某个地方吗?我以为[body appendData:imageData]; 处理了所有编码的东西
    • 那么这就是文件“破坏”数据加载的原因...我现在要编辑我的答案...
    猜你喜欢
    • 2011-05-28
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多