Google Drive API v3 .NET:如何让用户直接从Google驱动器下载文件,而不是从服务器下载?

时间:2017-12-27 16:59:48

标签: c# asp.net webforms google-drive-api

我正在使用google drive api v3在asp.net网站上工作,但仍然是新手。一切都与谷歌驱动器api一起运作良好。但我对目前下载文件的方式并不满意。

以下是示例代码:

    public static string DownloadGoogleFile(string fileId)
    {
            DriveService service = GetService(); //Get google drive service
            FilesResource.GetRequest request = service.Files.Get(fileId);

            string FileName = request.Execute().Name;                
            string FilePath = Path.Combine(HttpContext.Current.Server.MapPath("~/Downloads"),FileName);                

            MemoryStream stream = new MemoryStream();

            request.MediaDownloader.ProgressChanged += (Google.Apis.Download.IDownloadProgress progress) =>
            {
                switch (progress.Status)
                {
                    case DownloadStatus.Downloading:
                        {
                            Console.WriteLine(progress.BytesDownloaded);                                
                            break;
                        }
                    case DownloadStatus.Completed:
                        {
                            Console.WriteLine("Download complete.");
                            SaveStream(stream, FilePath); //Save the file 
                            break;
                        }
                    case DownloadStatus.Failed:
                        {
                            Console.WriteLine("Download failed.");
                            break;
                        }
                }
            };
            request.Download(stream);                

            return FilePath;
    }

这是代码背后的事件处理程序:

protected void btnDownload_Click(object sender, EventArgs e)
{

    try
    {
        string id = TextBox3.Text.Trim();
        string FilePath = google_drive.DownloadGoogleFile(id);

        HttpContext.Current.Response.ContentType = MimeMapping.GetMimeMapping(FilePath);
        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(FilePath));
        //HttpContext.Current.Response.WriteFile(FilePath);          
        HttpContext.Current.Response.TransmitFile(FilePath);
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.End();
    }        
    catch (Exception ex)
    {
        //Handle Exception
    }
}

因此,当用户请求从Google驱动器下载文件时,服务器将首先下载该文件,然后将其传回给用户。我想知道是否有办法让用户直接从谷歌驱动器而不是从服务器通过浏览器下载文件。如果没有,我想我应该在用户下载后删除服务器上的下载文件。请赐教。非常感谢。

1 个答案:

答案 0 :(得分:0)

直接从浏览器下载文件将使用webContentLink

  

用于在浏览器中下载文件内容的链接。这是   仅适用于云端硬盘中包含二进制内容的文件。"

显然,您使用的是ASP,但是当我使用云端硬盘选择器时,我只会分享一下如何使用JS进行操作:

 function downloadImage(data) {
      if (data.action == google.picker.Action.PICKED) {
        var fileId = data.docs[0].id;
        //for images
        // var webcontentlink = 'https://docs.google.com/a/google.com/uc?id='+fileId+'&export=download'

        var webcontentlink = ' https://docs.google.com/uc?id='+fileId+'&export=download'
       window.open( webcontentlink,'image/png');
      }
    }