我决定在我的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 ..
我寻求此错误并遇到同样的问题,但我无法理解我的错误。任何人都可以帮助我或清楚地修复我的代码。 谢谢:))
答案 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/的内容来计算上传速度并确定可靠的块大小,而不会产生太多开销。