1

Rackspaceクラウドファイルからmp3ファイルをダウンロードしています。大きなファイルの場合、ダウンロードは正常に完了していますが、ファイルはまだ完全にダウンロードされていません。たとえば、40 MB mp3ファイル(01:00:00デュレーション)は、4.5 MB mp3ファイル(00:10:30デュレーション)としてダウンロードされます。これは常に起こるわけではありません。ASIHTTPRequestとRackspaceクラウドファイルを使用した不完全なファイルのダウンロード

  1. 何が起こっているかについての指針はありますか?
  2. なぜこのようなことが起こり、この問題を解決するにはどうすればよいですか?
  3. ファイルが完全にダウンロードされたかどうかをチェックする簡単なチェックサムロジックを構築するにはどうすればよいですか?私は4件の同時ダウンロードとネットワークキューを使用してい

    ASIHTTPRequest *request; 
    request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:urlString]]; 
    [request setShouldAttemptPersistentConnection:NO]; 
    [request setAllowResumeForFileDownloads:YES]; 
    [request setDownloadProgressDelegate:self]; 
    [request setShouldContinueWhenAppEntersBackground:YES]; 
    [request setUserInfo:userInfo]; 
    [request setDownloadDestinationPath:downloadPath]; 
    [request setTemporaryFileDownloadPath:[NSString stringWithFormat:@"%@.download", downloadPath]]; 
    
    [self.networkQueue addOperation:request]; 
    [self.networkQueue go]; 
    

    注:私が作成し、非同期要求を送信する方法をここで

です。

ありがとうございました。

編集(月2012年3月5日、午前3時25分PM)

ので、さらなる調査がASINetworkQueueではなくrequestDidFailSelectorrequestDidFinishSelectorデリゲートメソッドを呼び出していることを示しています。 ASIHTTPRequestオブジェクトから返されるステータスコードは、requestDidFinishSelectorメソッドの206, HTTP/1.1 206 Partial Contentです。ステータスコードは200, HTTP/1.1 200 OKである必要があります。

私はまだなぜか分からない!私はまだこれを解決する方法を知らない。部分的にダウンロードしたファイルを削除して、ダウンロードプロセスを再開しなければならないようです。この時点で一時ファイル、すなわち%@.downloadが削除され、この部分的にダウンロードされたファイルは宛先パスに置かれます。

+0

ASIHTTPのバグかどうかチェックしましたか? –

+0

はい、このようなものは見つかりませんでした。 – Mustafa

+0

こんにちは@Mustafa、私はiOSとラックスペースクラウドサービスを統合するのが初めてで、iOSを使ってラックスペースに接続できるリソースを教えてくれれば嬉しいです。そのためのライブラリやSDKはありますか? – bizsytes

答えて

1

これは私がやったことです。うまくいけば、これで問題は解決します。ここで

iはネットワークキューを作成しています方法は次のとおりです。

- (ASINetworkQueue *)networkQueue { 

    if (!_networkQueue) { 
     _networkQueue = [[ASINetworkQueue alloc] init]; 
     [_networkQueue setShowAccurateProgress:YES]; 
     [_networkQueue setRequestDidFinishSelector:@selector(contentRequestDidSucceed:)]; 
     [_networkQueue setRequestDidFailSelector:@selector(contentRequestDidFail:)]; 
     [_networkQueue setShouldCancelAllRequestsOnFailure:NO]; 
     [_networkQueue setDelegate:self]; 
    } 

    return _networkQueue; 
} 

そして、ここでは私のcontentRequestDidSucceed:メソッドが何をするかだ。これを処理する良い方法があれば

- (void)contentRequestDidSucceed:(ASIHTTPRequest *)request { 
    // ASIHTTPRequest doesn't use HTTP status codes (except for redirection), 
    // so it's up to us to look out for problems (ex: 404) in the requestDidFinishSelector selector. 
    // requestDidFailSelector will be called only if there is the server can not be reached 
    // (time out, no connection, connection interrupted, ...) 

    // In certain cases ASIHTTPRequest/ASINetworkQueue calls the delegate method requestDidFinishSelector, 
    // instead it should call requestDidFailSelector. I've encountered this specific case with status code 206 (HTTP/1.1 206 Partial Content). In this case the file was not completely downloaded, so we'll have to re-process the request. 
    if ([request responseStatusCode] != 200) { 
     NSLog(@" "); 
     NSLog(@"======= BEEP ======="); 
     NSLog(@" "); 

     // We're double checking that the file was indeed not downloaded completely! 
     // During internal testing, we encountered a case where download was successful 
     // but we received 206 as the response code (maybe we received the cached value). 
     unsigned long long progress = [request totalBytesRead] + [request partialDownloadSize]; 
     unsigned long long total = [request contentLength] + [request partialDownloadSize]; 

     if (progress != total) { 
      NSString *downloadPath = [request downloadDestinationPath]; 
      NSString *temporaryDownloadPath = [self temporaryPathForFile:downloadPath]; 

      // Move the file at destination path to the temporary destination path (back again)  
      NSError *moveError = nil; 
      [[[[NSFileManager alloc] init] autorelease] moveItemAtPath:downloadPath 
                   toPath:temporaryDownloadPath 
                   error:&moveError]; 

      if (moveError) { 
       NSLog(@"Failed to move file from '%@' to '%@'", downloadPath, temporaryDownloadPath); 

       NSError *removeError = nil; 
       [ASIHTTPRequest removeFileAtPath:downloadPath error:&removeError]; 

       if (removeError) { 
        NSLog(@"Failed to remove file from '%@'", downloadPath); 
       } 
      } 

      // Call the requestDidFailSelector method 
      [self contentRequestDidFail:request]; 

      // Don't continue 
      return; 
     }   
    } 

    // TODO: Process successful request! 
    // . . . 
} 

、私に知らせてください。

+0

部分的にダウンロードしても、キャッシュから自分のフォルダにファイルを移動することはまったく同じです。かなりハックした実装.. – Andy

関連する問題