1

ユーザーが自分の写真を自分の Web サーバーにアップロードできるアプリを開発しています。最近、複数のファイルを一度にアップロードするためのサポートを追加しました。ユーザーは iPhone アルバムから写真を選択して、サーバーにアップロードできます。

1 つのファイルをアップロードすることは問題ありませんが、複数のファイルをアップロードしようとすると、次のエラーが発生します。

The operation couldn't be completed (kCFErrorDomainCFNetwork error 303.)

ファイルのアップロードに使用しているコードは次のとおりです。

// start the uploading for each photo
for(int i = 0; i < photosArray.count; i++)
{
    Photo *currentPhoto = [photosArray objectAtIndex:i];

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"upload", @"command", UIImageJPEGRepresentation(currentPhoto.image,70),@"file", [NSNumber numberWithInt:album.albumId], @"albumId", currentPhoto.title, @"title", currentPhoto.description, @"description", nil];

    [[AFAPI sharedInstance] commandWithParams:params onCompletion:^(NSDictionary *json)
     {
         //completion
         if (![json objectForKey:@"error"]) 
         {
             // hide the UIProgressView and show the detail label
             UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
             UIProgressView *pv = (UIProgressView *) [cell viewWithTag:4];
             pv.hidden = YES;

             UILabel *detailLabel = (UILabel *) [cell viewWithTag:3];
             detailLabel.text = @"Upload completed";
             detailLabel.hidden = NO;

         } 
         else 
         {
             //error :(
             NSString* errorMsg = [json objectForKey:@"error"];
             [UIAlertView error:errorMsg];
         }
     }
     onUploadProgress:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) 
    {
         // ...
    }];
}

for ループを使用して photosArray を列挙しています。見つかったすべての写真について、画像 (currentPhoto.image) をアップロードします。commandWithParams 関数の実装は次のとおりです。

-(void)commandWithParams:(NSMutableDictionary*)params onCompletion:(JSONResponseBlock)completionBlock onUploadProgress:(void (^)(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))uploadProgressBlock
{
    NSData* uploadFile = nil;
    if ([params objectForKey:@"file"]) 
    {
        uploadFile = (NSData*)[params objectForKey:@"file"];
        [params removeObjectForKey:@"file"];
    }

NSMutableURLRequest *apiRequest = 
[self multipartFormRequestWithMethod:@"POST" 
                                path:kAPIPath 
                          parameters:params 
           constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
               if (uploadFile) {
                   [formData appendPartWithFileData:uploadFile 
                                               name:@"file" 
                                           fileName:@"photo.jpg" 
                                           mimeType:@"image/jpeg"];
               }
           }];

AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest];
[operation setUploadProgressBlock:uploadProgressBlock];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    //success!
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //failure :(
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
}];

[operation start];
}

長いコード部分で申し訳ありませんが、このエラーを解決する方法が本当にわかりません。NSOperationQueue を使用しようとしましたが、同じエラーが発生しました。

インターネットで検索したところ、CFNetwork のエラー 303 は、HTTP 応答を解析できなかったことを意味することがわかりました。問題はWebサービスにあるのでしょうか?もしそうなら、アップロードされたファイルを処理するphp部分を与えることもできます:)

前もって感謝します!

4

1 に答える 1

1

これは AFNetworking のバグだと思います。まったく同じ問題がありましたが、2012 年 8 月 24 日にダウンロードした最新バージョンにアップグレードすると問題が解決しました。

于 2012-08-24T12:07:31.103 に答える