2

好吧...第一次发帖...希望我能做对!(如果我错过了什么,或者做错了什么,请告诉我,我会尽力修复它!:))

场景:

我们有一个闭路电视服务器,可以将镜头记录到一个文件夹中。素材文件被分成 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() ,但这只是再次给了我“等待激活”......

4

0 回答 0