我无法从Google云端硬盘API获取具有短时URL(downloadUrl)的文件 [英] I cannot get the file with short-lived URL (downloadUrl) from Google Drive API
问题描述
我无法从Google Drive API v2提供的downloadUrl获取文件.
这是屏幕截图.
我已经尝试了几个网站,但仍然会发生.我该如何解决?还是Google的问题?
20200312我将Javascript用于Google File Picker,它为所选择的文件返回JSON.然后,我使用Classic ASP将文件获取到服务器并保存.
这是代码
前端
函数initGooglePicker(){var picker = new FilePicker({apiKey:API_KEY,clientId:CLIENT_ID,buttonEl:document.getElementById('btnGoogleDrive'),onSelect:function(file,access_token){var path,ext,filename;如果(file.downloadUrl){路径= file.downloadUrl;文件名= file.title;ext = filename.split('.').pop().toLowerCase();}否则,如果(file.exportLinks){如果(file ['exportLinks'] ['application/pdf']){路径= file ['exportLinks'] ['application/pdf'] +& exportFormat = pdf";ext ="pdf";文件名= file.title +."+分机;}}$('#access_token').val(access_token);},onCancel:function(){}});}
后端
函数UploadGoogleDriveFile(fromPath,toPath,accessToken)暗淡retVal ="0"昏暗的objXML设置objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")objXML.Open"GET",fromPath,FalseobjXml.SetRequestHeader"Authorization","Bearer"&accessTokenobjXML.Send如果objXML.readystate = 4然后Response.Write(objXML.status&< br>")Response.Write(objXML.responseBody)响应结束万一如果objXML.readystate = 4并且objXML.status = 200然后如果Len(objXML.responseText)>acct_cv_file_size然后retVal ="2"别的CreateFolderBeforeUpload(toPath)设置objStream = Server.createobject("Adodb.Stream")objStream.Type = 1objStream.OpenobjStream.Write objXML.responseBodyobjStream.SaveToFile toPath,2objStream.Close设置objStream = NothingretVal ="1"万一万一设置objXML = NothingUploadGoogleDriveFile = retVal结束功能
如果您要使用Drive API V2下载文件并在标头中设置访问令牌,则必须通过调用以下网址来做到这一点:>
https://www.googleapis.com/drive/v2/files/[file-Id]?alt=media
如响应部分所述在文件:获取端点中.网址参数 alt = media
使其真正起作用非常重要.
我以前曾使用过此代码(对我有用),我在问题跟踪器,这样您也可以使用另一种方法.
<代码>//fileurl-https://www.googleapis.com/drive/v2/files/[file-Id]?alt=media//accessToken-客户端的accessToken//filepath-存储下载文件的位置公共无效下载GdriveFileThroughWebRequest(字符串fileurl,字符串filepath,字符串accessToken){HttpWebRequest rq =(HttpWebRequest)WebRequest.Create(fileurl);rq.Method ="GET";rq.PreAuthenticate = true;rq.Headers.Add("Authorization","Bearer" + accessToken);尝试 {HttpWebResponse resp =(HttpWebResponse)rq.GetResponse();使用(流输出= File.OpenWrite(filepath)){使用(Stream s = resp.GetResponseStream()){byte []缓冲区=新的byte [8192];int bytesRead;而((bytesRead = s.Read(buffer,0,buffer.Length))> 0){output.Write(buffer,0,bytesRead);}}}}捕获(WebException ex){使用(var stream = ex.Response.GetResponseStream())使用(var reader = new StreamReader(stream)){reader.ReadLine();Console.WriteLine(reader.ReadToEnd());}}}
I have problem on getting files from downloadUrl provided from Google Drive API v2.
Here is the screenshot.
I have tried several websites and it still occurs. How can I fix it? Or is it a problem from Google?
20200312 Edit: I am using Javascript for Google File Picker and it returns JSON for the picked file. Then I use Classic ASP to get the file to server and save.
Here is the code
Front-end
function initGooglePicker() {
var picker = new FilePicker({
apiKey: API_KEY,
clientId: CLIENT_ID,
buttonEl: document.getElementById('btnGoogleDrive'),
onSelect: function(file, access_token) {
var path, ext, filename;
if (file.downloadUrl) {
path = file.downloadUrl;
filename = file.title;
ext = filename.split('.').pop().toLowerCase();
}
else if (file.exportLinks) {
if (file['exportLinks']['application/pdf']) {
path = file['exportLinks']['application/pdf'] + "&exportFormat=pdf" ;
ext = "pdf";
filename = file.title + "." + ext;
}
}
$('#access_token').val(access_token);
},
onCancel: function() {}
});
}
Back-end
Function UploadGoogleDriveFile(fromPath, toPath, accessToken)
Dim retVal
retVal = "0"
Dim objXML
Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")
objXML.Open "GET", fromPath, False
objXml.SetRequestHeader "Authorization", "Bearer " & accessToken
objXML.Send
If objXML.readystate = 4 Then
Response.Write(objXML.status & "<br>")
Response.Write(objXML.responseBody)
Response.End
End If
If objXML.readystate = 4 And objXML.status = 200 Then
If Len(objXML.responseText) > acct_cv_file_size Then
retVal = "2"
Else
CreateFolderBeforeUpload(toPath)
Set objStream = Server.createobject("Adodb.Stream")
objStream.Type = 1
objStream.Open
objStream.Write objXML.responseBody
objStream.SaveToFile toPath, 2
objStream.Close
Set objStream = Nothing
retVal = "1"
End If
End If
Set objXML = Nothing
UploadGoogleDriveFile = retVal
End Function
If you want to download a file using the Drive API V2 and setting the access token in the header, you have to do it by calling this url:
https://www.googleapis.com/drive/v2/files/[file-Id]?alt=media
As it's told in the Response section in the Files: get endpoint. It's really important the url parameter alt=media
in order to make it work.
I've used this code before (works for me), which I found on Issue Tracker, in that way you can have another approach, too.
//fileurl - https://www.googleapis.com/drive/v2/files/[file-Id]?alt=media
//accessToken - client's accessToken
//filepath - location to store the downloaded file
public void downloadGdriveFileThroughWebRequest(string fileurl, string filepath, string accessToken)
{
HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(fileurl);
rq.Method = "GET";
rq.PreAuthenticate = true;
rq.Headers.Add("Authorization", "Bearer " + accessToken);
try {
HttpWebResponse resp = (HttpWebResponse)rq.GetResponse();
using (Stream output = File.OpenWrite(filepath))
{
using (Stream s = resp.GetResponseStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
}
}
catch (WebException ex)
{
using (var stream = ex.Response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
reader.ReadLine();
Console.WriteLine(reader.ReadToEnd());
}
}
}
这篇关于我无法从Google云端硬盘API获取具有短时URL(downloadUrl)的文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!