使用 NSURLSessionUploadTask fromFile,如何将 HTML 输入名称与正在上传的文件链接



我想从iOS设备将文件上传到服务器。我想使用NSURLSessionUploadTask,我希望上传从文件获取正在上传的文件的内容。

服务器期望收到一个名为"目击.zip"的文件。

用于上传的HTML表单包含名称为"fileBean"的输入标记,如下所示:

<input name="fileBean" type="file" />

我想我需要设置请求,以便它包含正确的" Content-disposition"信息:

Content-Disposition: form-data; name="fileBean"; filename="sightings.zip"

但我不知道如何根据我能找到的示例、关于 so 的问题和 Apple 文档来做到这一点。

我的相关代码如下。

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.allowsCellularAccess = YES;
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[operationManager backgroundQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[GGPConstants urlFor:GGP_SEND_SIGHTINGS_PATH]];
[request setHTTPMethod:@"POST"];
[request setValue:@"identity" forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"Content-Type" forHTTPHeaderField:@"application/zip"];
[request addValue:@"sightings.zip" forHTTPHeaderField:@"fileName"];
// How to get the value for the name and filename into the content disposition as per the line below?    
// Content-Disposition: form-data; name="fileBean"; filename="sightings.zip"
NSURLSessionUploadTask *uploadTask = [session
    uploadTaskWithRequest:request
    fromFile:myFileURL
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"Error: %@", error);
        } else {
            // Celebrate the successful upload...
        }
}];

过去我使用过 AFNetworking's AFHTTPRequestSerializer ,它在构建表单数据时提供输入名称,但由于其他原因对我不起作用。

任何帮助将不胜感激。

我不推荐表单数据类型,因为它很容易出错。 最好使用application/x-www-form-urlencoded,这真的是微不足道的构造。 在这种格式中,正文数据基本上看起来像一个 GET 请求,但没有问号,例如

name=foo.jpg&data=[url-encoded data blob here]

其中,可以按照Apple文档中的说明生成URL编码的数据blob,并添加几个(__bridge_transfer NSString *)和(__bridge CFStringRef)位。 :-)

话虽如此,在Stack Overflow上已经有一个不错的多部分表单数据示例。 请注意,当您实际使用它时,您会在边界的前面添加两个额外的连字符,因此如果您指定"foo"作为边界,则每个部分之间将有"--foo"。

相关内容

  • 没有找到相关文章

最新更新