0

とてもシンプルだと思いますが、どうしたらいいのかわかりませんでした。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とフォームデータを使用して他のWebサービスにファイルをアップロードできました。PUTリクエスト(AFHTTPClientとputPathを使用)を使用しましたが、それでもその単純なファイルアップロードの方法がわかりません。

ご協力いただきありがとうございます!

4

3 に答える 3

9

私はAFNetworking2.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];
于 2014-02-04T23:14:34.163 に答える
4

これはAFNetworkingFAQの一部です。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サブクラスのベースURLを設定すると、次のhttp://server.orgように呼び出すことができます。

NSData *imageData = [NSData dataWithContentsOfFile:pathToYourJPEGFile];
[client putPath:@"social/test.jpg"
     parameters:nil
           data:imageData
        success:yourSuccessBlock
        failure:yourFailureBlock];
于 2012-08-26T11:15:14.873 に答える
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];
于 2015-07-22T20:13:43.193 に答える