使用 NSURLSessionUploadTask fromFile,如何 link HTML 输入名称与正在上传的文件?
Using NSURLSessionUploadTask fromFile, how to link the HTML input name with the file being uploaded?
我想将文件从 iOS 设备上传到服务器。我想使用 NSURLSessionUploadTask
并且我希望上传从文件中获取正在上传的文件的内容。
服务器期望接收名为 "sightings.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
,它在您构建表单数据时提供输入名称,但由于其他原因对我不起作用。
如有任何帮助,我们将不胜感激。
不推荐form-data类型,容易出错。最好使用 application/x-www-form-urlencoded,构造起来真的很简单。在那种格式中,正文数据基本上看起来像 GET 请求,但没有问号,例如
name=foo.jpg&data=[url-encoded data blob here]
其中 url 编码的数据 blob 可以按照 Apple's docs 中的描述使用几个 (__bridge_transfer NSString *) 和 (__bridge CFStringRef) 位生成添加。 :-)
话虽如此,Stack Overflow 上已经有 decent example 多部分表单数据。请注意,实际使用时,您会在边界前面添加两个额外的连字符,因此,如果您指定 "foo" 作为边界,那么每个部分之间都会有“--foo”。
我想将文件从 iOS 设备上传到服务器。我想使用 NSURLSessionUploadTask
并且我希望上传从文件中获取正在上传的文件的内容。
服务器期望接收名为 "sightings.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
,它在您构建表单数据时提供输入名称,但由于其他原因对我不起作用。
如有任何帮助,我们将不胜感激。
不推荐form-data类型,容易出错。最好使用 application/x-www-form-urlencoded,构造起来真的很简单。在那种格式中,正文数据基本上看起来像 GET 请求,但没有问号,例如
name=foo.jpg&data=[url-encoded data blob here]
其中 url 编码的数据 blob 可以按照 Apple's docs 中的描述使用几个 (__bridge_transfer NSString *) 和 (__bridge CFStringRef) 位生成添加。 :-)
话虽如此,Stack Overflow 上已经有 decent example 多部分表单数据。请注意,实际使用时,您会在边界前面添加两个额外的连字符,因此,如果您指定 "foo" 作为边界,那么每个部分之间都会有“--foo”。