C# 从Google Drive下载的文件已损坏

C# 从Google Drive下载的文件已损坏,c#,google-drive-api,C#,Google Drive Api,我在下载过程中遇到问题,它会下载,但下载的文件大小相同:108102字节;不管实际文件是小于还是大于此值 我能够成功上传PDF文件,并设置其权限,使任何人都可以通过链接查看该文件https://drive.google.com/open?id=UNIQUE_ID_HERE。下面是我用来异步下载文件的函数: /// <summary>Downloads the media from the given URL.</summary> private async

我在下载过程中遇到问题,它会下载,但下载的文件大小相同:108102字节;不管实际文件是小于还是大于此值

我能够成功上传PDF文件,并设置其权限,使任何人都可以通过链接查看该文件https://drive.google.com/open?id=UNIQUE_ID_HERE。下面是我用来异步下载文件的函数:

    /// <summary>Downloads the media from the given URL.</summary>
    private async Task DownloadFile(DriveService service, string url)
    {
        var downloader = new MediaDownloader(service);
        downloader.ChunkSize = DownloadChunkSize;
        // add a delegate for the progress changed event for writing to console on changes
        downloader.ProgressChanged += Download_ProgressChanged;

        var fileName = DownloadDirectoryName + @"\cover_new.pdf";

        Console.WriteLine("Downloading file from link: {0}", url);

        using (var fileStream = new System.IO.FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            var progress = await downloader.DownloadAsync(url, fileStream);

            if (progress.Status == DownloadStatus.Completed)
            {
                Console.WriteLine(fileName + " was downloaded successfully: " + progress.BytesDownloaded);
            }
            else
            {
                Console.WriteLine("Download {0} was interrupted in the middle. Only {1} were downloaded. ", fileName, progress.BytesDownloaded);
            }
        }
    }
///从给定的URL下载媒体。
专用异步任务下载文件(DriveService服务,字符串url)
{
var downloader=新媒体下载器(服务);
downloader.ChunkSize=下载ChunkSize;
//添加进度更改事件的委托,以便在更改时写入控制台
downloader.ProgressChanged+=下载\u ProgressChanged;
var fileName=DownloadDirectoryName+@“\cover\u new.pdf”;
WriteLine(“从链接{0}下载文件”,url);
使用(var fileStream=new System.IO.fileStream(文件名,System.IO.FileMode.Create,System.IO.FileAccess.Write))
{
var progress=wait downloader.downloadsync(url,fileStream);
if(progress.Status==DownloadStatus.Completed)
{
Console.WriteLine(文件名+”已成功下载:“+progress.BytesDownloaded”);
}
其他的
{
控制台。WrdLead(“下载{ 0 }”在中间被中断。只下载了{ 1 }。”文件名、进度。
}
}
}

此外,我可以使用链接从其他浏览器成功打开此文件,而无需输入任何凭据。

我错误地尝试使用URL下载此文件,如:
https://drive.google.com/open?id=UNIQUE_ID_HERE

我对我的方法所做的更改:

  • 第二个参数,
    url
    ,现在是一个
    文件
    对象。我正在传递URL,但我应该使用
    service.Files.Get()
    并使用其Id获取文件
  • 为清楚起见,将第二个参数重命名为fileToDownload
  • 由于我现在有一个文件对象
    downloadfile
    用于我要下载的文件,因此我可以调用它的
    downloadsync
    方法,将我已有的文件流发送给它
新代码如下:

    private async Task DownloadFile(DriveService service, Google.Apis.Drive.v3.Data.File fileToDownload)
    {

        var downloader = new MediaDownloader(service);
        downloader.ChunkSize = DownloadChunkSize;
        // add a delegate for the progress changed event for writing to console on changes
        downloader.ProgressChanged += Download_ProgressChanged;

        var fileName = DownloadDirectoryName + @"\cover_new.pdf";

        var downloadfile = service.Files.Get(fileToDownload.Id);

        Console.WriteLine("Downloading file with id: {0}", fileToDownload);

        using (var fileStream = new System.IO.FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
        {
            var progress = await downloadfile.DownloadAsync(fileStream);

            if (progress.Status == DownloadStatus.Completed)
            {
                Console.WriteLine(fileName + " was downloaded successfully: " + progress.BytesDownloaded);
            }
            else
            {
                Console.WriteLine("Download {0} was interrupted in the middle. Only {1} were downloaded. ", fileName, progress.BytesDownloaded);
            }
        }
    }

我希望这对其他人有所帮助。

您是否尝试过查看在文本编辑器中下载的文件内容。我怀疑这是一个显示错误消息或某种登录屏幕方式的HTML页面。@Phylyp,我用Notepad++打开了内容,全部是HTML/javascript,但我没有看到任何拒绝访问错误或类似的内容。我想这可能是一个登录,但我不能肯定。我用
.html
扩展名重命名了该文件,但我无法在浏览器中打开它,它加载了一个空白页,当我查看它时,源代码都在那里。@Phylyp,。我想第一个问题应该是我是否使用了正确的url进行下载。DownloadAsync方法需要url作为第一个参数。很高兴您已经解决了它,感谢您共享解决方案。