谷歌选择器 => 如何下载文件



C# 如果重要的话。我正在尝试做的是允许移动电话(或台式机(上的用户将文件上传到我的Web服务器。我已经构建了选择器,为范围驱动器找到了所有身份验证。

但是,在下载文件时,我在示例中不断看到的是他们使用Javascript下载文件,然后将其再次上传到服务器。我想从我的服务器获取它。我在Dropbox上工作正常,但谷歌是一个问题。

我按照这里的指南进行操作: https://developers.google.com/picker/docs/

但是,我将fileId和令牌发送到服务器:

function pickerCallback(data) {
if (data.action == google.picker.Action.PICKED) {
var datastring = "url=" + data.docs[0].url + "&name=" + data.docs[0].name + "&mimetype=" + data.docs[0].mimetype + "&fileId=" + data.docs[0].id + "&token=" + oauthToken;
$.ajax({
type: "POST",
url: "/FileUpload/GetGoogleDriveFile/",
data: datastring,
dataType: "json",
success: function (data) {
if (data.success != null && data.success == true) {
window.location.href = "@Html.Raw(AfterUploadDestination)";
}
else
{
alert("Error: " + data.ErrorMsg);
}
},
error: function (xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
}
});

googlepicker.setVisible(false);
}
}

然后在服务器上,我有类似的东西...

var client = new System.Net.WebClient();
client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + file.token);

然后是使用文件的东西:

doc.Contents = client.DownloadData(string.Format("https://www.googleapis.com/drive/v3/files/{0}?alt=media", file.fileId));

问题在于,该文件不仅是文件的二进制流,而且是当您访问带有该链接的网站时Google显示的网页本身。

我到底如何下载文件?

提前感谢,我希望这不会太长以至于没有人阅读它。

您可以查看此文档,了解如何使用 Google Picker API 打开文件。当用户从列表中选择文件时,将返回file ID,并且你的应用可能会使用该ID来访问该文件。在打开文件时从选取器获取file ID后,应用程序可以提取文件元数据并下载文件内容,如files.get的参考文档中所述。

是我。

我问谷歌可能是什么问题,支持回来了,你需要创建一个类型为"其他"的客户端ID。所以当它不起作用时,我以为这是我的代码。

我需要做的就是使用附带的客户端 ID 作为网站(Web 应用程序类型(,并创建一个特定的 API 密钥供选择器使用。

对于任何有问题的人来说,这是代码的实质:

所以我的客户端代码是:

function pickerCallback(data) {
if (data.action == google.picker.Action.PICKED) {
var datastring = "url=" + data.docs[0].url + "&name=" + data.docs[0].name + "&mimetype=" + data.docs[0].mimetype + "&fileId=" + data.docs[0].id + "&token=" + oauthToken;
$.ajax({
type: "POST",
url: "/FileUpload/GetGoogleDriveFile/",
data: datastring,
dataType: "json",
success: function (data) {
if (data.success != null && data.success == true) {
window.location.href = "@Html.Raw(AfterUploadDestination)";
}
else
{
alert("Error: " + data.ErrorMsg);
}
},
error: function (xhr, textStatus, errorThrown) {
console.log(xhr.responseText);
}
});
googlepicker.setVisible(false);
}
}

服务器代码为:

public class GoogleFileDetails
{
public string url { get; set; }
public string name { get; set; }
public int mimetype { get; set; }
public string fileId { get; set; }
public string token { get; set; }
}
[HttpPost]
public ActionResult GetGoogleDriveFile(GoogleFileDetails file) {
byte[] contents = null;
try
{
var client = new System.Net.WebClient();
client.Headers.Set(HttpRequestHeader.Authorization, "Bearer " + file.token);
contents = client.DownloadData(string.Format("https://www.googleapis.com/drive/v2/files/{0}?alt=media", file.fileId));
} catch etc...

我使用此代码通过谷歌选择器从驱动器下载二进制图像。技巧部分在xhr.responseType = 'blob'中;

var xhr = new XMLHttpRequest();
xhr.open('GET', THE_PREVIOUSLY_GOTTEN_DOWNLOAD_URL);
xhr.setRequestHeader('Authorization', 'Bearer ' + THE_OBTAINED_OAUTHTOKEN);
xhr.responseType = 'blob';
xhr.onload = function () {
// Better trigger and event and manage the response outside the onload function. 
// Just for demo purposes:
$('#THE_IMG_ID').attr( 'src', URL.createObjectURL(xhr.response) );
};
xhr.onerror = function () {
};
xhr.send();

最新更新