javascript - Google Apps Script Web App POST“简单请求”莫名其妙地失败了 CORS 预检
问题描述
我正在使用 Google Apps 脚本创建一个网络应用程序,允许企业上传 PDF 格式的“支持文档”以进行商业保险审计。该程序通过 GET 请求为上传页面提供服务,然后页面将文件和标识信息发布到相同的 URL。用户将没有 Google 帐户。
根据 Tanaike 的这些说明,将编码文件内容加载到页面上的隐藏表单中,然后让表单 POST 其内容时,它工作正常。这种方法的缺点是可能会向单个表单字段添加大量数据:一个 60 MB 的文件会使 Chrome 爬行并最终崩溃。这些文件通常是扫描文档,因此可能会出现较大的文件大小。
为了避免这个问题,我尝试使用XMLHttpRequest
,但立即遇到了 CORS 问题:
Access to XMLHttpRequest at 'https://script.google.com/a/[REDACTED]/exec' from origin 'https://[REDACTED]script.googleusercontent.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
推荐的解决方案似乎是确保 POST 请求是一个不会触发 CORS 预检检查的“简单请求”。
尽管遵循了简单请求的建议,但我仍然遇到 CORS 失败。我已将程序缩减为:
服务器端:
function doPost(e) {
Logger.log(e.postData.contents);
return ContentService.createTextOutput();
}
客户端(在称为用户表单 onsubmit 处理程序的函数中):
// postURL is the deployed URL of the web app, ending in /exec.
const xhr = new XMLHttpRequest();
xhr.open('POST', postURL);
xhr.setRequestHeader('Content-Type', 'text/plain');
xhr.send(JSON.stringify({'message': 'Hello world!'}));
我尝试使用为“只有我自己”和“任何人”部署的网络应用程序,没有任何变化。它设置为像我一样运行,它必须这样做才能对上传的文件执行所需的操作。
看起来Tanaike 的可恢复上传示例程序XMLHttpRequest
通过从服务器端脚本获取 OAuth 令牌来管理使用和 PUT。我还不确定这是否适用于我正在尝试做的半匿名上传。
由于 Apps 脚本的限制,我是在尝试做一些本来就不可能的事情,还是我错过了什么?
解决方案
推荐阅读
- powershell - 如何在 Powershell 中安装 Mailkit
- github - 当脚本在本地运行时 GitHub Actions 失败,在自托管上没有问题,因为 NPM 警告
- php - PayPal PHP SDK 1.14 致命错误,无法解决错误
- python - Python:获取裁剪区域外的平均颜色
- firebase - Flutter - Firebase:迭代列表中的子列表
- assembly - 如何将对应的 (*) 值显示为 2 位十六进制数字在四位 7 段 LED 显示屏的最右边两位?
- php - 提交按钮只保存一个输入框
- php - Magento 2 数据补丁问题
- python - 从两个字典中绘制线图
- python - 使用 beautifulsoup 和 pandas 将提取的数据从链接转换为数据框