使用UrlFetchApp下载PNG图片生成损坏文件的问题排查
问题分析与解决方案
你的代码问题出在DriveApp.createFile的参数使用错误:
当前代码调用的createFile(name, content, mimeType)重载方法,第二个参数要求是字符串内容,但你传入了Blob对象,这会导致Blob被强制转换为字符串(而非写入二进制数据),最终生成的文件内容是Blob对象的文本描述,而非PNG的二进制图像数据,所以文件损坏且仅4KB大小。
修正后的代码
直接使用createFile(blob)重载方法,传入获取到的Blob即可:
function download() { let imageBlob = UrlFetchApp.fetch("https://pub-cdn.apitemplate.io/2022/12/212ebbf4-8051-446b-bc3a-1a225b2a3758.png").getBlob(); // 给Blob设置文件名(可选,省略则默认使用URL中的文件名) imageBlob.setName("menu.png"); DriveApp.getFolderById("1vb7ZzdhBfsK6t154Z2CR-RpBNEKvyPB6").createFile(imageBlob); }
也可以使用显式指定二进制内容的重载(但不如直接传Blob简洁):
function download() { let response = UrlFetchApp.fetch("https://pub-cdn.apitemplate.io/2022/12/212ebbf4-8051-446b-bc3a-1a225b2a3758.png"); DriveApp.getFolderById("1vb7ZzdhBfsK6t154Z2CR-RpBNEKvyPB6").createFile("menu.png", response.getContent(), MimeType.PNG); }
补充说明
UrlFetchApp默认会自动跟随重定向,所以你最初的带参数API链接,只要修正createFile的用法,也能正常下载到正确的PNG文件。
内容的提问来源于stack exchange,提问作者Mathias Maes
相关产品推荐
相关产品推荐

