winforms 使用服务帐户从Google云端硬盘下载文件时出现问题

mec1mxoz  于 2022-11-17  发布在  Go
关注(0)|答案(2)|浏览(140)

这个代码已经让我挠头好几天了。
我正在尝试使用Google云端硬盘和服务帐户为我的应用程序实现自动更新。
在我的Google云端硬盘中,有一个名为Update的文件夹,它与服务帐户共享。在Update文件夹中有两个文件,一个是名为Version.txt的文本文件,它是最新版本号的字符串,另一个是可执行文件Update.exe,它是最新的应用程序版本。
我可以很好地阅读VersionIdenttxt文件,但当我试图下载~ 1 MB的可执行文件时,会有一个延迟,它似乎会经历下载文件的动作,但内存流ms 2之后总是空的。
有人有什么想法吗?这可能是一些与服务帐户身份验证,但我不知道如何修复它。

public class GoogleDriveAccess
{
    //google drive file IDs
    private readonly static string versionFileID = @"blahblahblahblah";
    private readonly static string updateFileID = @"blehblehblehbleh";

    //check for updated assembly on google drive and install if authorised
    public async static void CheckForUpdate()
    {
        try
        {
            //load json key file from resources into a byte array
            var jsonFile = Properties.Resources.drive_access;

            //create service account keyfile from json byte array
            var serviceAccountKeyfile = System.Text.Encoding.Default.GetString(jsonFile);

            //create Google credentials with full access from service account keyfile
            GoogleCredential credential = GoogleCredential.FromJson(serviceAccountKeyfile)
                .CreateScoped(new[] { DriveService.ScopeConstants.Drive });

            //create Google drive service using credentials
            DriveService service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential
            });

            //get version file metadata
            var getRequest = service.Files.Get(versionFileID);

            //download version file to memory
            await using var ms = new MemoryStream();
            await getRequest.DownloadAsync(ms);

            //read memory stream into a string
            ms.Position = 0;
            var sr = new StreamReader(ms);
            string textUpdateVersion = sr.ReadToEnd().Trim();

            //obtain our current assembly version
            Version currentVersion = Assembly.GetEntryAssembly().GetName().Version;

            //create an assembly version from the downloaded version text file
            Version updateVersion = new Version(textUpdateVersion);

            //if downloaded version is higher than our current version then request to download new assembly
            if (updateVersion > currentVersion)
            {
                //prompt user to commence update
                DialogResult result = MessageBox.Show($"Would you like to update to the latest version {updateVersion}?", Properties.Resources.AppName, MessageBoxButtons.YesNo);
                if (result == DialogResult.Yes)
                {
                    //get update file metadata
                    getRequest = service.Files.Get(updateFileID);

                    //download update file to memory
                    await using var ms2 = new MemoryStream();
                    await getRequest.DownloadAsync(ms2);

                    //***ms2 is always empty here***

                    //convert file to binary
                    ms2.Position = 0;
                    var br = new BinaryReader(ms2);
                    byte[] bin = br.ReadBytes(Convert.ToInt32(ms2.Length));

                    //rest of code

                }
            }
        }
        catch
        {
           //deal with any exceptions
        }
    }
}
ars1skjm

ars1skjm1#

file.get有一个可选的婴儿车

尝试将其设置为true

getRequest = service.Files.Get(updateFileID);
getRequest.AcknowledgeAbuse  = true;

然后看看它是否不会让你下载它。

xzlaal3s

xzlaal3s2#

最后,谷歌似乎认为我的文件感染了病毒。
添加getRequest.AcknowledgeAbuse并没有改变任何东西,结果是一样的。
将文件扩展名从.exe更改为.bin也没有任何作用,因为Web应用程序仍将文件名视为update.bin.exe
上传的文件是.zip可执行文件。似乎GD不喜欢这种类型的文件。
上传一个重命名为.bin的非压缩.exe文件似乎已经解决了这个问题。
现在我的流终于有了文件内容。

相关问题