2

私のアプリでは、ユーザーはビデオを録画するか、フォト アルバムからビデオを選択し、php スクリプトを介してビデオ ファイルをサーバーにアップロードできます。ファイルをサーバーにアップロードするために、AFNetworking を使用しています。私はもともと写真アルバムからビデオをアップロードしようとしましたが、それを機能させることができなかったので、メインバンドルにビデオを追加しました (php スクリプト用に作成した 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];

HTML フォームを介して同じビデオをアップロードできるため、私の PHP スクリプトは正常に動作します。ただし、上記のコードは setUploadProgressBlock に到達できません。

何かが壊れているように誰かに突き出ていますか、それとも私が見逃しているものは他にありますか?

前もって感謝します

4

2 に答える 2

5

これは私が問題を解決するために使用したものです:

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];
于 2012-05-10T18:53:25.140 に答える
4

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

さらに重要: 次の行を置き換えます。

[operation start];

と:

[httpClient enqueueHTTPRequestOperation:operation];
于 2012-05-08T19:49:27.613 に答える