好的......第一篇文章...希望生病了! (如果我错过了什么,或做错了什么,请让我知道并尽力解决它!:))
情景:
我们有一个CCTV服务器,可以录制文件到文件夹。素材文件分为1GB文件。 (平均每天45gb)
1个月后,这些文件将移至Google云端硬盘文件夹,并从服务器上的本地硬盘中删除。 (成功上传后单向同步删除...我们有无限的谷歌驱动器存储) [至于上传的大小,一夜之间上传45gb对我们来说真的不是问题。我们有一个对称的1gbps专用互联网线路]
这是管理层要求完成的方式,所以遗憾的是我必须尝试做这项工作......
我在哪里!
所以...我在VB.net中敲了一个控制台应用程序,它有效! (代码将在下面附上......)。这将在每晚午夜到服务器上运行 我将它设置为上传到正确的文件夹,并使用一组测试文件(恰好是我桌面上的文件夹中的文本文件),它们都正确上传和删除! Wahoo,看起来都很有希望!
一如既往......总有一些东西不能正常运作。
我用一些CCTV素材文件(他们的.xsf文件)替换了测试文本文件,而且......简而言之,它没有用。
我把它放回.txt文件,然后再次运行。但是,只要文本文件获得任何大小(IE ...创建文本文件并使其达到50mb左右),它就会拒绝再次使用。
我使用Google Drive API v3和OAuth2进行身份验证。
我最初的想法是因为我没有使用异步上传。我真的想做:
Dim UploadRequest As FilesResource.CreateMediaUpload = Service.Files.Create(CurrentFile, Stream, CurrentFile.MimeType)
Dim Response = UploadRequest.Upload()
这似乎从未奏效。
然后我读了一些内容,发现Google Drive API允许可恢复的上传,可以上传中期。我想......也许可能会这样做,因为文件很大,可能会有问题。
这就是我的立场......我似乎无法让异步上传工作......
我已将upload()替换为uploadASync(),如下所示
Dim Response = UploadRequest.UploadAsync()
并且不会抛出任何错误。当然,要让它起作用是不是很简单?
不。
在每个UploadAsync()之后,我运行了一个返回Response.Status.ToString的短循环,只是为了向我展示异步上传的状态,并试着看看发生了什么...... 我得到的只是"等待激活" ...
我不知道从哪里开始。
我会抛出与上传下载相关的代码,这样你就可以看到发生了什么。然而,还有其他位在之前,期间和之后运行...例如互联网测试(检查连接是否是在尝试任何类型的上传之前生活,调试行(写入文件的位置)等... 如果我的任何代码看起来像是糟糕的做法,我也要道歉。我尝试使用我认为正确的方法,并且没有与开发者/等人一起学习良好实践的经验。但由于基本核心功能正在运行,因为它确实上传了我的测试文本文件,我想我正在做正确的事情。 欢迎提供建设性的反馈和有用的提示,但请保持温和!
主要
Sub Main()
Try
createDirectory()
UploadFiles()
Catch ex As Exception
*logs any errors here*
End Try
End Sub
CreateDirectory()运行良好,并返回其创建的文件夹的folderID。这里没问题。
推广服务 (运作良好)
Private Sub CreateService()
Dim ClientId = *obviously removed*
Dim ClientSecret = *Also removed*
Dim MyUserCredential As UserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(New ClientSecrets() With {.ClientId = ClientId, .ClientSecret = ClientSecret}, {DriveService.Scope.Drive}, "user", CancellationToken.None).Result
Try
Service = New DriveService(New BaseClientService.Initializer() With {.HttpClientInitializer = MyUserCredential, .ApplicationName = "Google Drive CCTV Uploader"})
Catch Ex As Exception
*logging any errors to file*
End Try
End Sub
实际上传文件的代码(Anndddd这是它崩溃的地方)
Private Sub UploadFiles()
For Each footageFile As IO.FileInfo In directory.GetFiles
If Service.ApplicationName <> "Google Drive CCTV Uploader" Then CreateService()
UploadSuccess = False
If footageFile.Extension.Equals(".xsf") AndAlso (Now - footageFile.CreationTime).Days >= 7 Then
CurrentFile.Name = blah *other metadata added here*
Dim ByteArray As Byte() = System.IO.File.ReadAllBytes(*Path to file*)
Dim Stream As New System.IO.MemoryStream(ByteArray)
Dim UploadRequest As FilesResource.CreateMediaUpload = Service.Files.Create(CurrentFile, Stream, CurrentFile.MimeType)
Try
Dim Response = UploadRequest.UploadAsync()
If Response.Status.ToString = "Failed" Then
Throw New System.Exception(Response.Exception.ToString)
Else
UploadSuccess = True
End If
Catch ex As Exception
*log error*
End Try
If UploadSuccess = True Then
footageFile.Delete()
End If
End If
Next
Console.WriteLine("Backup Complete!")
System.Threading.Thread.Sleep(6000)
Exit
End Sub
那就是它!任何想法将不胜感激。在此先感谢:)
编辑1
所以,正如Adrian评论的那样,我对代码的布局进行了更改,现在运行如下...
Using StreamBob = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Dim request As FilesResource.CreateMediaUpload = Service.Files.Create(CurrentFile, StreamBob, CurrentFile.MimeType)
request.Upload()
End Using
然而,这仍然没有让人伤心。 Request.upload()实际上从不上传任何文件(回到使用非常小的txt文件)。也没有抛出异常,它只是继续通过request.upload()...
想知道出了什么问题我再一次修改了代码,所以我有了
dim response = request.Upload()
console.writeline(reponse.status.tostring)
这返回了一个非常有趣的结果...... 500错误...下面的堆栈跟踪
response.status.tostring returned "Failed"
Google.Apis.Requests.RequestError
[500]
No individual errors
at Google.Apis.Upload.ResumableUpload`1.<HandleResponse>d__95.MoveNext() in C:\Apiary\v1.20\google-api-dotnet-client\Src\Support\GoogleApis\Apis\[Media]\Upload\ResumableUpload.cs:line 676
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Apis.Upload.ResumableUpload`1.<SendNextChunkAsync>d__94.MoveNext() in C:\Apiary\v1.20\google-api-dotnet-client\Src\Support\GoogleApis\Apis\[Media]\Upload\ResumableUpload.cs:line 654
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Apis.Upload.ResumableUpload`1.<UploadCoreAsync>d__91.MoveNext() in C:\Apiary\v1.20\google-api-dotnet-client\Src\Support\GoogleApis\Apis\[Media]\Upload\ResumableUpload.cs:line 581
我再次尝试了request.uploadAsync(),但这只是给了我&#34;等待激活&#34;再次....