我想从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"。