2012-05-08 8 views
2

私のアプリでは、ユーザーはビデオを録画したりフォトアルバムからビデオを選択したり、PHPスクリプトを使ってビデオファイルをサーバーにアップロードすることができます。ファイルをサーバーにアップロードするには、AFNetworkingを使用しています。私はもともとフォトアルバムからビデオをアップロードしようとしましたが、動作させることができなかったので、メインバンドルにビデオを追加しました。iOS 5 - AFNetworking - アップロードビデオ

コードは次のとおりです。私は、HTMLフォーム経由で同じ動画をアップロードすることができる午前として

NSString *vidURL = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mov"]; 
    NSData *videoData = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:vidURL]]; 

    NSLog(@"The test vid's url is %@.",vidURL); 

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL fileURLWithPath: @"http://www.mywebsite.com"]]; 

    NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload.php" parameters:nil constructingBodyWithBlock:^(id <AFMultipartFormData>formData) 
    { 
     [formData appendPartWithFileData:videoData name:@"file" fileName:@"test.mov" mimeType:@"video/quicktime"]; 
    }]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest]; 

    [operation setUploadProgressBlock:^(NSInteger bytesWritten,long long totalBytesWritten,long long totalBytesExpectedToWrite) 
    { 

     NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); 

    }]; 

    [operation start]; 

私のPHPスクリプトが正常に実行します。しかし、上記のコードはsetUploadProgressBlockに到達できません。

誰かに壊れてしまったり、何か他のものがありますか?

ありがとうございます。

答えて

5

:で

[operation start]; 

:この行を交換して使用する理由

httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.mysite.com"]]; 

    NSMutableURLRequest *afRequest = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload.php" parameters:nil constructingBodyWithBlock:^(id <AFMultipartFormData>formData) 
    { 
     [formData appendPartWithFileData:videoData name:@"file" fileName:@"filename.mov" mimeType:@"video/quicktime"]; 
    }]; 


    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:afRequest]; 

    [operation setUploadProgressBlock:^(NSInteger bytesWritten,long long totalBytesWritten,long long totalBytesExpectedToWrite) 
    { 

     NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); 

    }]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {NSLog(@"Success");} 
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {NSLog(@"error: %@", operation.responseString);}]; 
    [operation start]; 
4

多分、オブジェクトの割り当てが即座に解除されている可能性があります。 AFHTTPClientをクラスのインスタンス変数にするか、それをサブクラス化してシングルトンにします。

もっと重要:これは私がこの問題を修正するために使用したものである

[httpClient enqueueHTTPRequestOperation:operation]; 
+0

興味があるだけ[ httpClient enqueueHTTPRequestOperation:operation]を[operation start]経由で実行しますか?ほとんどのAFNetworkingの呼び出しは[操作開始]です。また、操作のレスポンスにnull戻り値を取得しています。 – Will

+1

大丈夫、[操作の開始]も動作するはずですが、なぜAFHTTPClientのNSOperationQueueを使用しないのですか?これにより、要求の実行が自動的にスケジューリングされ、並行操作に適しています。両方を行うことは誤りであることに注意してください。 – Felix