1

我正在尝试在执行可恢复上传的 Google 驱动器上上传大文件。

这是代码流

第 1 步:使用 Drive 服务在 Google Drive 上创建文件并使用 put 请求启动可恢复的上传会话

    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();          
     }

第 2 步:使用 UploadUrl 上传块。字节数组是 256kb 的倍数,并且对该函数的调用在每个块的循环中

    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)
        {
        }
    }

对于我最后一个不是 256KB 倍数的块,我收到错误消息

System.Net.WebException:远程服务器返回错误:(400)错误请求。在 System.Net.HttpWebRequest.GetResponse()

我在这段代码中做错了什么?请建议。提前致谢

马尤雷什。

4

1 回答 1

0

尝试检查最后一个块是否传递了正确的大小,而不是本论坛中所述的整个数组。Ali 在该论坛中表示,“一个潜在的问题是:如果您发送的字节数组对于最后一个请求是半空的(即,读取的缓冲区小于块大小)。” 这是可恢复上传的示例实现。希望这可以帮助。

于 2017-05-12T16:39:23.997 回答