首页 > 解决方案 > 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 脚本的限制,我是在尝试做一些本来就不可能的事情,还是我错过了什么?

标签: javascriptgoogle-apps-scriptweb-applicationscorscross-domain

解决方案


推荐阅读