使用 asp.net mvc 从 Google 驱动器 Api 下载文件时出现问题
Problems with files downloading from Google Drive Api using asp.net mvc
我可以在本地服务器上成功下载文件,但部署后我无法继续加载而不下载
<a href="~/Home/DownloadFile/@item.Id">Download</a>
HomeController.cs
public void DownloadFile(string id)
{
string FilePath = DownloadGoogleFile(id);
Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(FilePath));
Response.WriteFile(System.Web.Hosting.HostingEnvironment.MapPath("/GoogleDriveFiles/" + Path.GetFileName(FilePath)));
Response.End();
Response.Flush();
}
static string DownloadGoogleFile(string fileId)
{
Google.Apis.Drive.v3.DriveService service = GetService();
string FolderPath = System.Web.Hosting.HostingEnvironment.MapPath("/GoogleDriveFiles/");
Google.Apis.Drive.v3.FilesResource.GetRequest request = service.Files.Get(fileId);
string FileName = request.Execute().Name;
string FilePath = System.IO.Path.Combine(FolderPath, FileName);
MemoryStream stream1 = 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(stream1, FilePath);
break;
}
}
};
request.Download(stream1);
return FilePath;
}
public static Google.Apis.Drive.v3.DriveService GetService()
{
var CSPath = System.Web.Hosting.HostingEnvironment.MapPath("~/");
UserCredential credential;
using (var stream = new FileStream(Path.Combine(CSPath, "client_secret.json"), FileMode.Open, FileAccess.Read))
{
String FilePath = Path.Combine(CSPath, "DriveServiceCredentials.json");
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(FilePath, true)).Result;
}
Google.Apis.Drive.v3.DriveService service = new Google.Apis.Drive.v3.DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GoogleDriveRestAPI-v3",
});
return service;
}
我应该改变什么?我正在尝试从 google 获取文件,它本身不是来自浏览器,是 SSL 证书并且网络安全与此有关,因为我的网络现在不安全?
向 Google 进行身份验证时,安装的应用程序和 Web 应用程序之间存在差异。安装的应用程序可以在本机的浏览器中打开授权window,Web应用程序需要在用户机器上打开网络浏览器进行授权。 GoogleWebAuthorizationBroker.AuthorizeAsync
专为与已安装的应用程序一起使用而设计。它将打开 Web 浏览器以在服务器上进行身份验证和授权,但无法正常工作。
对于 Web 应用程序,您应该使用 GoogleAuthorizationCodeFlow
using System;
using System.Web.Mvc;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;
namespace Google.Apis.Sample.MVC4
{
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "PUT_CLIENT_ID_HERE",
ClientSecret = "PUT_CLIENT_SECRET_HERE"
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
// In this sample we use the session to store the user identifiers.
// That's not the best practice, because you should have a logic to identify
// a user. You might want to use "OpenID Connect".
// You can read more about the protocol in the following link:
// https://developers.google.com/accounts/docs/OAuth2Login.
var user = controller.Session["user"];
if (user == null)
{
user = Guid.NewGuid();
controller.Session["user"] = user;
}
return user.ToString();
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
}
查看完整样本 here
我可以在本地服务器上成功下载文件,但部署后我无法继续加载而不下载
<a href="~/Home/DownloadFile/@item.Id">Download</a>
HomeController.cs
public void DownloadFile(string id)
{
string FilePath = DownloadGoogleFile(id);
Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(FilePath));
Response.WriteFile(System.Web.Hosting.HostingEnvironment.MapPath("/GoogleDriveFiles/" + Path.GetFileName(FilePath)));
Response.End();
Response.Flush();
}
static string DownloadGoogleFile(string fileId)
{
Google.Apis.Drive.v3.DriveService service = GetService();
string FolderPath = System.Web.Hosting.HostingEnvironment.MapPath("/GoogleDriveFiles/");
Google.Apis.Drive.v3.FilesResource.GetRequest request = service.Files.Get(fileId);
string FileName = request.Execute().Name;
string FilePath = System.IO.Path.Combine(FolderPath, FileName);
MemoryStream stream1 = 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(stream1, FilePath);
break;
}
}
};
request.Download(stream1);
return FilePath;
}
public static Google.Apis.Drive.v3.DriveService GetService()
{
var CSPath = System.Web.Hosting.HostingEnvironment.MapPath("~/");
UserCredential credential;
using (var stream = new FileStream(Path.Combine(CSPath, "client_secret.json"), FileMode.Open, FileAccess.Read))
{
String FilePath = Path.Combine(CSPath, "DriveServiceCredentials.json");
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
"user",
CancellationToken.None,
new FileDataStore(FilePath, true)).Result;
}
Google.Apis.Drive.v3.DriveService service = new Google.Apis.Drive.v3.DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GoogleDriveRestAPI-v3",
});
return service;
}
我应该改变什么?我正在尝试从 google 获取文件,它本身不是来自浏览器,是 SSL 证书并且网络安全与此有关,因为我的网络现在不安全?
向 Google 进行身份验证时,安装的应用程序和 Web 应用程序之间存在差异。安装的应用程序可以在本机的浏览器中打开授权window,Web应用程序需要在用户机器上打开网络浏览器进行授权。 GoogleWebAuthorizationBroker.AuthorizeAsync
专为与已安装的应用程序一起使用而设计。它将打开 Web 浏览器以在服务器上进行身份验证和授权,但无法正常工作。
对于 Web 应用程序,您应该使用 GoogleAuthorizationCodeFlow
using System;
using System.Web.Mvc;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;
namespace Google.Apis.Sample.MVC4
{
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "PUT_CLIENT_ID_HERE",
ClientSecret = "PUT_CLIENT_SECRET_HERE"
},
Scopes = new[] { DriveService.Scope.Drive },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
// In this sample we use the session to store the user identifiers.
// That's not the best practice, because you should have a logic to identify
// a user. You might want to use "OpenID Connect".
// You can read more about the protocol in the following link:
// https://developers.google.com/accounts/docs/OAuth2Login.
var user = controller.Session["user"];
if (user == null)
{
user = Guid.NewGuid();
controller.Session["user"] = user;
}
return user.ToString();
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
}
查看完整样本 here