Google Classroom作业附件格式错误:HTML替代JPG/PDF问题求助
问题分析与解决方案
核心问题
你的代码在上传文件到Drive时,文件被识别为HTML的原因主要有以下几点:
- 直接使用
response.getBlob()时,Blob的MIME类型未被正确覆盖,若服务器返回的Content-Type为text/html,文件就会被误识别 - 固定文件名
"evidence"缺少对应扩展名,Google Drive无法通过后缀辅助判断文件类型 - 目标URL可能存在重定向,导致实际获取到的是HTML跳转页面而非真实的图片/PDF
修复后的代码
function uploadFileToDrive(url) { // 发起请求时强制跟随重定向,确保获取真实文件内容 var response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() }, followRedirects: true, muteHttpExceptions: true // 捕获异常,方便排查返回内容 }); // 检查HTTP状态码,确认请求成功 if (response.getResponseCode() !== 200) { throw new Error(`请求失败,状态码:${response.getResponseCode()},返回内容:${response.getContentText()}`); } var fileExtension = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); var mimeType; switch (fileExtension) { case 'jpg': case 'jpeg': mimeType = 'image/jpeg'; // 标准MIME类型为image/jpeg,而非image/jpg break; case 'pdf': mimeType = 'application/pdf'; break; default: // 扩展名匹配失败时,优先用响应头的MIME类型,兜底用二进制流 mimeType = response.getHeaders()['Content-Type'] || 'application/octet-stream'; break; } // 显式设置Blob的MIME类型,并给文件名添加对应扩展名 var blob = response.getBlob().setContentType(mimeType).setName(`evidence.${fileExtension}`); var file = Drive.Files.insert({ title: blob.getName(), mimeType: mimeType }, blob); return file.id; }
关键改动说明
- 添加
followRedirects: true:自动跟随URL重定向,避免获取到跳转后的HTML页面 - 增加状态码检查和异常捕获:快速定位请求失败原因(比如是否是登录验证页、404错误)
- 修正JPG的MIME类型:使用标准的
image/jpeg类型,确保系统/服务能正确识别 - 文件名添加扩展名:通过
evidence.${fileExtension}让Drive能通过后缀辅助判断文件类型 - 显式设置Blob的MIME类型:强制覆盖Blob的默认类型,避免沿用响应头的错误类型
额外排查步骤
- 验证URL有效性:直接在浏览器打开目标URL,确认返回的是图片/PDF而非HTML页面
- 检查OAuth权限:确保脚本已获得
https://www.googleapis.com/auth/drive.file和https://www.googleapis.com/auth/script.external_request权限 - 添加调试日志:在代码中加入
Logger.log(response.getHeaders()['Content-Type']),确认响应头返回的MIME类型是否正确
内容的提问来源于stack exchange,提问作者grantc
相关产品推荐
相关产品推荐

