2

更新:我找到了解决方案。这并不一定能解决所有情况,所以我将把这个问题留一小段时间,以防有人能启发我更多。我通过更改 url 的格式解决了这个问题:Google Drive 允许使用这种格式下载文件:

https://docs.google.com/uc?export=download&id=FILE_ID

所以我不知道这是否是其他 URL 的问题;实际上也不确切为什么 .getDownloadUrl() 不起作用......也许有人可以解释。但是现在这似乎在我可以测试的浏览器中工作......


我有一个简单的 WebApp 脚本,我通过添加 Apps Script 小工具在 Google 站点上运行它。该小工具的运行方式与以下表单示例完全相同:

https://developers.google.com/apps-script/guides/html/communication#forms

该小工具旨在执行以下操作:加载页面时,会返回一个表单,用户必须输入许可证密钥才能获得下载产品的链接。我的代码提供表单 OK,并获得表单提交 OK;然后它验证密钥,如果有效,则发回一个下载链接。一切正常;问题是,无论我尝试返回什么下载链接,caja iframe 包装器都会阻止点击链接实际下载文件。

我首选的返回 URL 实际上是通过 Drive API:下载文件在 Google Drive 上,我得到的下载链接如下:

DriveApp.getFileById(downloadFileId).getDownloadUrl()

但是,当在为 WebApp 小工具生成的 caja iframe 中单击返回的链接时,什么也没有发生。我已经尝试了一些其他 URL 格式指向驱动器上的该文件,但没有任何下载工作。

这可能吗?

4

1 回答 1

1

.getDownloadUrl()方法返回可用于下载文件的临时URL。此 URL 仅在短时间内有效,之后它会过期并且不再返回文件 - 这可能是您的 Web 应用程序中的链接不起作用的原因。无法准确记住 URL 的有效时间,但我认为它可能短至 5 分钟。

永久下载 URL 存储在另一个文件属性中:webContentLink. 但是,此属性(还)不能通过 Google Apps Drive Service 获得 - 您必须使用Advanced Drive Service才能访问它。您可以在脚本中的 Advanced Google services 下启用 Drive API。启用后,您可以像这样使用它:

var file = Drive.Files.get(FILE_ID_HERE);
var dlUrl = file.webContentLink;

这将返回链接,就像您在更新中找到并发布的链接一样。使用 Drive API 获取链接而不是硬编码的一个优点是,如果 Google 更改了该 URL 的格式,您使用 Drive API 获取链接的代码将继续工作,而硬编码链接将不会。

完整的 Drive Web API 参考(Advanced Drive Service 使用的)位于https://developers.google.com/drive/v2/reference/

于 2014-12-01T18:25:07.100 回答