如何将Web App接收的二进制字符串转为Google Drive可用Blob并上传?
解决Google Apps Script Web App接收Excel文件上传损坏问题
问题原因
Google Apps Script(GAS)中,e.postData.contents返回的是字符串类型。Excel文件属于二进制数据,直接将该字符串转为Blob时,会因字符串编码(默认UTF-8)的特性丢失原始二进制字节,最终导致上传后的文件损坏。而你的Python Flask代码中,request.data直接获取原始字节流,因此能正确处理二进制文件。
修复方案
根据POST请求的二进制数据传输方式,选择以下两种修复代码之一:
情况1:请求发送的是原始二进制流
直接通过e.postData.getBytes()获取原始字节数组,再创建Blob:
function doPost(e) { // 获取原始二进制字节数组 const byteArray = e.postData.getBytes(); // 创建符合格式的Blob并上传到Drive const blob = Utilities.newBlob(byteArray, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'myExcelFile.xlsx'); DriveApp.createFile(blob); return ContentService.createTextOutput("文件上传成功!"); }
情况2:请求发送的是Base64编码的字符串
如果发送方将二进制数据转为Base64字符串后发送,先解码为字节数组再创建Blob:
function doPost(e) { // 将Base64字符串解码为字节数组 const byteArray = Utilities.base64Decode(e.postData.contents); const blob = Utilities.newBlob(byteArray, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'myExcelFile.xlsx'); DriveApp.createFile(blob); return ContentService.createTextOutput("文件上传成功!"); }
原理说明
- GAS中
e.postData.contents会把二进制数据按UTF-8编码解析为字符串,这会破坏非UTF-8兼容的二进制字节(比如Excel文件的PK头部分)。 - 直接使用
getBytes()获取原始字节数组,或对Base64编码的字符串解码,能保留完整的二进制数据,确保生成的Blob与原文件一致。
内容的提问来源于stack exchange,提问作者eceo
相关产品推荐
相关产品推荐

