VB.net将大型文件上传到Google云端硬盘失败

时间:2017-01-29 23:21:48

标签: vb.net file-upload google-drive-api google-developers-console

好的......第一篇文章...希望生病了! (如果我错过了什么,或做错了什么,请让我知道并尽力解决它!:))

情景:

我们有一个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;再次....

0 个答案:

没有答案