2017-03-17 254 views
0

我在下载过程中遇到问题,它下载,但下载的文件是相同的字节大小:108102字节;无论实际文件是小于还是大于此值。从Google Drive下载损坏的文件

我可以成功上传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); 
      } 
     } 
    } 

而且,我能够使用链接成功地从不同的浏览器中打开该文件,而无需输入任何凭据。

+1

您是否尝试过查看在文本编辑器中下载的文件内容。我怀疑这是一个显示错误消息或某种登录屏幕方式的HTML页面。 – Phylyp

+0

@Phylyp,我在Notepad ++中打开了所有内容,它都是html/javascript,但是我没有看到任何拒绝访问错误或类似的东西。我认为这可能是一个登录,但我不能肯定地说。我用'.html'扩展名重命名了文件,但我无法在浏览器中打开它,它加载了一个空白页面,当我查看它时,源代码都在那里。 –

+0

@Phylyp,。我想第一个问题应该是我是否使用正确的URL下载。 DownloadAsync方法需要url作为第一个参数。 –

回答

0

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

  • 第二个参数,url,现在是一个file对象:

    改变我对我的方法做。我传递的是URL,但是我应该使用service.Files.Get()并使用它的Id来获取文件。

  • 为了清晰起见,将第二个参数重命名为fileToDownload。
  • 因为我现在有一个文件对象downloadfile我想下载的文件,我可以调用它的DownloadAsync方法,发送它已经有的文件流。

新的代码如下:

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); 
      } 
     } 
    } 

我希望这可以帮助一个人在那里。

+1

很高兴你解决了它,并感谢分享解决方案。 – Phylyp