使用GAS Content Service下载PDF格式文件



我想使用webapp从驱动器下载PDF文件

但是PDF每次都会损坏,它可以很好地用于https://drive.google.com/file/d/1jrDKkk6uC0qx_XzqFHb4Bo1enZzB-YFv/view?usp=sharing但是同样的函数不能用于https://drive.google.com/file/d/1LFnQHb5C2g4zWGBXsbzKKB1C6OMgQGzi/view?usp=sharing

function doGet(e) {
var id = "1LFnQHb5C2g4zWGBXsbzKKB1C6OMgQGzi"
var template = HtmlService.createTemplateFromFile('Index');
return ContentService.createTextOutput().setMimeType(ContentService.MimeType.PDF).setContent(DriveApp.getFileById(id).getBlob().getDataAsString())
.downloadAsFile("file.pdf")
}

我也遇到过类似的情况。我想直接从GDrive下载文件,而不通过Google Web App共享链接. 不幸的是,
GAS ContentService为我们提供了一些mime类型,如CSV, JAVASCRIPT, JSON, VCARDS和TEXT;因此,我找到的下载像.PDF这样的文件的方法和.XLSX不将路径暴露给GDrive的方法是检索Blob版本将文件转换为Base64Encoded要导出到ContentService的字符串. 您可以使用方法Utilities.base64EncodedoGet方法。

strBase64Encoded = Utilities.base64Encode(blob.getBytes());
return ContentService.setContent(strBase64Encoded).setMimeType(ContentService.MimeType.TEXT);

这是在GAS上导出文件的方式。然而,如果你想要下载立即开始,你不能使用ContentService,而是使用HTMLService. 您必须创建一个HTML输出,其中包含将base64编码字符串转换为文件的javascript代码!我们可以通过创建一个伪锚来实现。

const blob             =  DriveApp.getFileById("your_file_ID").getBlob();
const strBase64Encoded = Utilities.base64Encode(blob.getBytes());
const html = `
<script>
const rawdata        = "${strBase64Encoded}";
const base64ToDecode = atob(rawdata);
const bytesArr       = new Array(base64ToDecode.length);
for (i = 0; i < base64ToDecode.length; i++){
bytesArr[i] = base64ToDecode.charCodeAt(i);
}
const bytes4Blob     = new Uint8Array(bytesArr)
const blob           = new Blob([bytes4Blob],{"type":"application/pdf"});
const downloadLink   = document.createElement("a");
downloadLink.href    = URL.createObjectURL(blob);
downloadLink.download = "filename.pdf";
downloadLink.click(); // this will start the download instantly! 
</script>
`;
return HtmlService.createHtmlOutput(html);

我希望这对你有帮助!

第二个url返回"文件在所有者的垃圾中。试着把文件从回收站移出来。

相关内容

  • 没有找到相关文章

最新更新