我无法从Google云端硬盘API获取具有短时URL(downloadUrl)的文件 [英] I cannot get the file with short-lived URL (downloadUrl) from Google Drive API

查看:68
本文介绍了我无法从Google云端硬盘API获取具有短时URL(downloadUrl)的文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆