2017-05-11 17 views
1

再開可能なアップロードを実行しているGoogleドライブに大きなファイルをアップロードしようとしています。ここでGoogleドライブの再開可能アップロードの問題

は、私は私が何を

System.Net.WebException: The remote server returned an error: (400) Bad Request. at System.Net.HttpWebRequest.GetResponse()

としてエラーを取得していますコードフロー256キロバイトの倍数ではない私の最後のチャンクの

Step 1 : Creating file on Google Drive using Drive service and initiating the resumable upload session using put request

String fileID = _DriveService.Files.Insert(googleFileBody).Execute().Id; 

    //Initiating resumable upload session 

    String UploadUrl = null; 

    String _putUrl = "https://www.googleapis.com/upload/drive/v2/files/" + fileID + "?uploadType=resumable"; 

    HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(_putUrl);  
    httpRequest.Headers["Authorization"] = "Bearer " + AccessToken; 
    httpRequest.Method = "PUT"; 
    requestStream = httpRequest.GetRequestStream(); 
    _webResponse = (HttpWebResponse)httpRequest.GetResponse(); 

    if (_webResponse.StatusCode == HttpStatusCode.OK) 
    { 
     //Getting response OK 
      UploadUrl = _webResponse.Headers["Location"].ToString();   
    } 

Step 2 : Uploading chunks to using UploadUrl . The byte array is in multiple of 256kb and call to this function is in the loop for every chunk

private void AppendFileData(byte[] chunk) 
    { 
     try 
     { 
      HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(UploadUrl); 
      httpRequest.ContentLength = chunk.Length; 
      httpRequest.Headers["Content-Range"] = "bytes " + startOffset + "-" + endOffset+ "/" + sourceFileSize; 
      httpRequest.ContentType= MimeType; 
      httpRequest.Method = "PUT"; 

     MemoryStream stream =new MemoryStream(chunk); 

      using (System.IO.Stream requestStream = httpRequest.GetRequestStream()) 
        { 
         stream.CopyTo(requestStream); 
         requestStream.Flush(); 
         requestStream.Close(); 
        } 

      HttpWebResponse httpResponse = (HttpWebResponse)(httpRequest.GetResponse()); // Throws exception as 
      //System.Net.WebException: The remote server returned an error: (308) Resume Incomplete. 
     //at System.Net.HttpWebRequest.GetResponse() 
     // There is no data getting appended to file 
     // Still executing the append for remaining chunks 

     } 
     catch(System.Net.WebException ex) 
     { 
     } 
    } 

ですこのコードで間違っている?提案してください。 ありがとうございます

Mayuresh

答えて

0

forumに記載されているように、最後のチャンクが正しいサイズであり、配列全体ではないかどうかを確認してください。 Aliはそのフォーラムで「潜在的な問題の1つは、最後のリクエストで半分空のバイト配列を送信している(つまり、バッファがチャンクサイズ未満で読み込まれている)ということです。次に、resumable uploadの実装例を示します。お役に立てれば。

+1

私はそれを理解しました。問題は「コンテンツ範囲」によるものです。最後のリクエストのエンドオフセットは、合計ファイルサイズで1未満でなければなりません – Mayuresh

関連する問題