0

我决定在我的 WPF 项目中使用 Google drive api。我搜索了许多文档和示例。我学习并成功了。一切都很好。我使用此功能进行插入/上传。

 public static Google.Apis.Drive.v2.Data.File InsertFile(DriveService service, String title, String description, String parentId, String mimeType, String filename)
        {
            Google.Apis.Drive.v2.Data.File body = new Google.Apis.Drive.v2.Data.File();
            body.Title = title;
            body.Description = description;
            body.MimeType = mimeType;
            if (!String.IsNullOrEmpty(parentId))
            {
                body.Parents = new List<ParentReference>() { new ParentReference() { Id = parentId } };
            }
            byte[] byteArray = System.IO.File.ReadAllBytes(filename);
            MemoryStream stream = new MemoryStream(byteArray);
            try
            {
                FilesResource.InsertMediaUpload request = service.Files.Insert(body, stream, mimeType);
                request.Upload();
                Google.Apis.Drive.v2.Data.File file = request.ResponseBody;
                return file;
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        }

当我想将一个小文件上传到谷歌驱动器时,它可以工作。但是我选择上传大文件,它给出了一个错误并且失败了。我收到了这个错误

System.Net.WebException was caught HResult=-2146233079 Message=The request was aborted: The request was canceled.Source=System StackTrace:
   at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
   at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at Google.Apis.Upload.ResumableUpload`1.SendChunk(Stream stream, Uri uri, Int64 position)
   at Google.Apis.Upload.ResumableUpload`1.Upload()
   at Google.Apis.Util.Utilities.InsertFile(DriveService service, String title, String description, String parentId, String mimeType, String filename) in ..

我寻求这个错误并遇到同样的问题,但我不明白我错在哪里。任何人都可以帮助我或清楚地修复我的代码。谢谢 :)

4

2 回答 2

2

我看到您正在将文件的所有内容读入 MemoryStream,这在上传大文件时显然会消耗大量内存。你能避免吗?

你可以像下面那样尝试吗?

FilesResource.InsertMediaUpload request = service.Files.Insert(body, File.OpenRead(filename), mimeType);

编辑

另外,如果您尝试上传大文件,我认为您可能应该考虑增加超时值以防止您的请求被中止。

于 2013-05-30T17:55:10.347 回答
0

尝试更改请求的块大小。

使用快速的互联网连接,我们没有任何问题。

然而,移动到 ADSL 连接时,我们注意到任何大于 5MB 的文件都会超时。

我们设置为

request.ChunkSize = 256 * 1024;

默认情况下,Google 使用 10,485,760 字节,即 10MB。因此,如果您无法在超时期限内上传 10MB,您将收到错误消息。

为了帮助您调试问题,请订阅 ProgressChanged 事件并在每次命中时输出

request.ProgressChanged += request_ProgressChanged;

....

static void request_ProgressChanged(Google.Apis.Upload.IUploadProgress obj)
{
    var output = String.Format("Status: {0} Bytes: {1}  Exception: {2}", obj.Status, obj.BytesSent, obj.Exception);
    System.Diagnostics.Debug.WriteLine(output);
}

我个人的意见是每 10-20 秒收到一次回复。60 秒 + 太长了。

您还可以使用http://www.speedtest.net/之类的东西来计算上传速度并确定可靠的块大小,而不会造成太多开销。

于 2013-06-14T06:01:53.513 回答