我认为这很简单,但我无法弄清楚如何做到这一点。我想使用AFNetworking库将文件上传到使用PUT请求到Web服务。这是我用来测试服务的curl命令
mac:~ user$ curl --verbose -T image.jpeg http://server.org:8001/social/test.jpg
* About to connect() to server.org port 8001 (#0)
* Trying 123.45.123.123...
* connected
* Connected to server.org (123.45.123.123) port 8001 (#0)
> PUT /social/test.jpg HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
> Host: server.org:8001
> Accept: */*
> Content-Length: 78341
> Expect: 100-continue
>
< HTTP/1.1 100 CONTINUE
< Server: cx1193719-b
< Content-Type: Text/Html
< Accept-Ranges: bytes
< Content-Length: 0
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Server: cx1193719-b
< Content-Type: Text/Html
< Accept-Ranges: bytes
< Content-Length: 0
<
* Connection #0 to host server.org left intact
* Closing connection #0
我已经能够使用POST上传文件并将表格数据上传到其他网络服务,我已经使用了PUT请求(使用AFHTTPClient和putPath),但我仍然不明白如何进行简单的文件上传。
感谢您的帮助!
答案 0 :(得分:9)
我正在使用AFNetworking 2.0并且想知道同样的事情。这就是我最终的结果:
// manager needs to be init'd with a valid baseURL
NSURL *baseURL = [AfarHTTPSessionManager sharedManager].baseURL;
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
NSData *imageData = UIImageJPEGRepresentation(draftHighlight.largeImage, 1);
// need to pass the full URLString instead of just a path like when using 'PUT' or 'POST' convenience methods
NSString *URLString = [NSString stringWithFormat:@"%@%@", baseURL, _the_rest_of_your_path];
NSMutableURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:imageData name:kCreateHighlightAPIKeyImage fileName:@"highlight_image.jpg" mimeType:@"image/jpeg"];
}];
// 'PUT' and 'POST' convenience methods auto-run, but HTTPRequestOperationWithRequest just
// sets up the request. you're responsible for firing it.
AFHTTPRequestOperation *requestOperation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
// success
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// failure
}];
// fire the request
[requestOperation start];
答案 1 :(得分:4)
这是AFNetworking常见问题解答的一部分。查看https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ。
此外,如果您使用AFHTTPClient
的子类,您可能希望使用类似于以下内容的方式扩展它:
- (void)putPath:(NSString *)path
parameters:(NSDictionary *)parameters
data:(NSData*)data
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
如本回答所示:https://stackoverflow.com/a/9014768/634940。
通过实施并将您的AFHTTPClient
子类'基本网址设置为http://server.org
,您可以继续致电:
NSData *imageData = [NSData dataWithContentsOfFile:pathToYourJPEGFile];
[client putPath:@"social/test.jpg"
parameters:nil
data:imageData
success:yourSuccessBlock
failure:yourFailureBlock];
答案 2 :(得分:0)
djibouti33的答案在我看来相当不错。但有一点需要注意的是,答案中的multipartFormRequest方法已被弃用。 AFNetworking现在建议您使用:
- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method
URLString:(NSString *)URLString
parameters:(NSDictionary *)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
error:(NSError *__autoreleasing *)error
这里需要注意的是,您需要通过执行以下操作来传递错误:
NSError *requestError = nil;
NSMutableURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:photoData name:@"file" fileName:@"image" mimeType:@"image/png"];
} error:&requestError];