0

我正在使用AFNetworkingAFAmazonS3Client将文件上传到 Amazon S3。我遍历了一组文件,并且所有文件都按预期成功上传到了 S3 服务器,但是在上传期间,每个不应该存在的文件都添加了额外的内容。例如,添加到名为 kmeans.sh 的文件中的文本如下所示:

--Boundary+0xAbCdEfGbOuNdArY
Content-Disposition: form-data; name="file"; filename="kmeans.sh"
Content-Type: application/octet-stream

这种内容出现在每个文件的顶部。我的上传方法如下:

NSMutableURLRequest *request = [self 
                       multipartFormRequestWithMethod:method 
                                                 path:destination 
                                           parameters:parameters 
              constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        [formData appendPartWithFileData:data 
                                    name:@"file" 
                                fileName:[fileURL.path lastPathComponent] 
                                mimeType:self.mimetype];
    }];

我在这里做错了什么,向我的文件添加了额外的信息?我真的很不知所措,我很感激我可以尝试的任何建议。

更新: 最初我按照马特的建议做了,但我使用了 PUT 方法而不是 POST。今天我下载了最新版本的 AFAmazonS3Client 并尝试使用以下方法上传带有 PUT 和 POST 的文件:

postObjectWithFile:(NSString *)path destinationPath:(NSString *)destinationPath parameters....
putObjectWithFile:(NSString *)path destinationPath:(NSString *)destinationPath parameters....

对于上传到存储桶 objcs3 和前缀“Site3/hei/”的文件“Lima1996.pdf”,stringToSign 看起来像:POST

multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY
Thu, 06 Jun 2013 00:37:04 GMT
/objcs3/Site3/hei/Lima1996.pdf

请求看起来像:

 auth: {
    "Accept-Language" = "en;q=1, nb;q=0.9";
    Authorization = "removed";
    "Content-Length" = 915478;
    "Content-Type" = "multipart/form-data; boundary=Boundary+0xAbCdEfGbOuNdArY";
    Date = "Thu, 06 Jun 2013 00:37:04 GMT";
    "User-Agent" = "connectCloudTest/1.0 (Mac OS X Version 10.8.4 (Build 12E55))";
  }

一切看起来都不错,但是当我使用 POST 方法上传文件时,我不断收到错误消息

Upload failed Expected status code in (200-299), got 405 (-1011)

虽然使用 PUT 方法会导致上一个错误,即上传成功但内容与原始问题中的额外标题信息一样乱码。非常感谢您的建议!

谢谢你的帮助!干杯,特隆德

4

2 回答 2

3

通过将AFAmazonS3ClientputObjectWithMethod中的替换为:

 (void)putObjectWithMethod:(NSString *)method
                   file:(NSString *)filePath
        destinationPath:(NSString *)destinationPath
             parameters:(NSDictionary *)parameters
               progress:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress
                success:(void (^)(id responseObject))success
                failure:(void (^)(NSError *error))failure
{
    NSMutableURLRequest *filerequest = [NSMutableURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]];
    [filerequest setCachePolicy:NSURLCacheStorageNotAllowed];

    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:filerequest returningResponse:&response error:&error];

    if (data && response) {

        NSMutableURLRequest *request = [super requestWithMethod:@"PUT" path:destinationPath parameters:nil];
        [self authorizeRequest:request withPath:destinationPath];
        [request setHTTPBody:data];

        AFHTTPRequestOperation *requestOperation = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (failure) {
            failure(error);
        }
    }];

       [requestOperation setUploadProgressBlock:progress];
       [self enqueueHTTPRequestOperation:requestOperation];
}

}

我不知道为什么我的 POST 方法从未奏效,但使用 PUT 一切正常。干杯,特隆德

于 2013-06-08T14:35:41.213 回答
0

AFAmazonS3Client 具有postObjectWithFile:destinationPath:parameters:progress:success:failure:处理所有多部分表单构建的方法。创建您自己的请求应该不是必需的,并且可能是文件中附加标头的原因。

于 2013-06-05T18:49:01.397 回答