好吧...第一次发帖...希望我能做对!(如果我错过了什么,或者做错了什么,请告诉我,我会尽力修复它!:))
场景:
我们有一个闭路电视服务器,可以将镜头记录到一个文件夹中。素材文件被分成 1gb 文件。(平均每天 45GB)
1 个月后,这些文件将被移动到 Google Drive 文件夹并从服务器上的本地 HDD 中删除。(上传成功后与删除同步的一种方式……我们有无限的谷歌驱动器存储空间)[至于上传的大小,一夜之间上传45gb对我们来说真的不是问题。我们有一条对称的 1gbps 专用互联网线路]
这是管理层要求完成的方式,所以遗憾的是我不得不尝试完成这项工作......
我在哪里!
所以...我在 VB.net 中拼凑了一个可以工作的控制台应用程序!(代码将附在下面......)。这将在每晚午夜在服务器上运行,我将其设置为上传到正确的文件夹,并使用一组测试文件(恰好是我桌面上文件夹中的文本文件),它们都上传和删除正确!哇,一切看起来都充满希望!
和以往一样……总会有一些事情不太对劲。
我用一些闭路电视录像文件(它们是 .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() 运行良好,并返回它创建的文件夹的文件夹 ID。这里没有问题。
驱动服务 (运行良好)
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() ,但这只是再次给了我“等待激活”......