【问题标题】:file.getDownloadUrl() not working for Google Add-on Apps Scriptfile.getDownloadUrl() 不适用于 Google Add-on Apps 脚本
【发布时间】:2020-09-21 17:15:20
【问题描述】:

我正在为 Google Drive 创建一个 google 插件。我正在使用DriveApp 类来访问和处理文件。我希望能够生成下载文件的链接。最后,我想将此下载链接发送到服务器以进行进一步的文件处理。

DriveApp 的 file 类似乎有一个完美的方法,file.getDownloadUrl(),它“获取可用于下载文件的 URL。

不幸的是,我看到了一些奇怪的行为,我不确定我是否正确使用了该方法。

首先,当在 Google 的文件类型上调用该方法时,该方法返回 null,例如application/vnd.google-apps.documentapplication/vnd.google-apps.spreadsheet。我们可能需要为要导出到的文件类型设置某种参数是有道理的,但这似乎不是getDownloadUrl() 的选项。

其次,当getDownloadUrl() 确实返回一个url 时,对该url 的访问受到严格限制。除非我使用 Chrome 并登录文件所有者的 G Suite 帐户,否则我无法访问该文件。登录所有者帐户,但在 Firefox 上浏览也会返回 403 错误。

我有一个在一组 Drive API 凭据上运行的烧瓶服务器。有没有办法授权这些凭据访问此下载链接?

任何帮助将不胜感激!

【问题讨论】:

    标签: google-cloud-platform google-api google-drive-api


    【解决方案1】:

    带有Google MIME type的文件不能直接下载,file.getDownloadUrl()返回null。

    例如,电子表格。

    手动下载之前,可以看到文件转换为.xlsx。所以要下载它,你需要把文件转换成东西。

    
        // --- Apps Script ---
        let new_file = Drive.Files.insert({ //DriveApi
            title: file.getName(), //name
            parents: [{
              id: file.getParents().next().getId() //folder
            }],
            mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //new mimeType
          },
          file.getBlob()
        );
    
        console.log(new_file.getDownloadUrl())
    
    

    但是,要从此链接下载文件,您需要登录 Google 并有权访问云端硬盘中的文件。

    否则,您可以获取文件的blob 并将其转换为其他位置的文件,例如在您的服务器上。

    
        // --- Apps Script ---
        let blob = file.getBlob()
        let blob_type = blob.getContentType() // for some reason, this is a application/pdf, so it will download as .pdf
        let blob_string = blob.getDataAsString() // data of this blob as a String with UTF-8 encoding
    
    
    
        // --- JS ---
        // convert to js blob
        let js_blob = new Blob([blob_string], {
          type: blob_type
        });
        // and download
        let a = document.createElement("a")
        document.body.appendChild(a)
        a.style = "display: none"
        let url = window.URL.createObjectURL(js_blob)
        a.href = url
        a.download = "fileName.pdf" //file name and extension
        a.click()
        a.remove()
        window.URL.revokeObjectURL(url)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多