Google云端硬盘Api .Net上传错误

时间:2013-05-30 14:25:05

标签: .net file-upload google-drive-api

我决定在我的WPF项目中使用Google驱动器api。我搜索了很多文档和样本。我学到了并且成功了.Everyhing运行良好。我使用这个函数进行插入/上传。

 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 ..

我寻求此错误并遇到同样的问题,但我无法理解我的错误。任何人都可以帮助我或清楚地修复我的代码。 谢谢:))

2 个答案:

答案 0 :(得分:2)

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

你可以这样做,试试吗?

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

<强>被修改

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

答案 1 :(得分:0)

尝试更改请求的块大小。

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

然而,转移到ADSL连接,我们发现它会因任何文件而超时&gt; 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/的内容来计算上传速度并确定可靠的块大小,而不会产生太多开销。