更改后使用 AJAX 重新上传文件会导致 Chrome 中的 net::ERR_UPLOAD_FILE_CHANGED

新手上路,请多包涵

我有一个简单的 HTML 表单,它通过 AJAX 将选定的文件发送到 API 端点。

如果我执行以下步骤:

  1. 按上传按钮并发出 POST 请求以上传文件
  2. 更改文件系统上的选定文件(在文本编辑器中),而无需在文件选择器中再次选择它。
  3. 再次按下上传按钮,并发出第二个 POST 请求

Chrome 将导致第二个请求失败并出现错误: net::ERR_UPLOAD_FILE_CHANGED 。请注意,如果您在初始上传之前更改了文件,则文件将不会出现问题。该错误仅在第二次上传时发生,即您在初次成功上传后更改文件。我正在用 CSV 文件对此进行测试,并在文本编辑器中进行更改。

似乎没有办法隔离该错误。

有没有办法解决?

如果不是,是否有可能捕获此特定错误,并向用户显示有意义的消息。 Fetch 在承诺中返回的错误没有关于此的具体信息。我看到 ERR_UPLOAD_FILE_CHANGED 的唯一地方是在浏览器开发控制台中。

我很确定大约一年前(2019 年初)这没有任何问题,因为重新上传更改后的文件的可能性在我们的 UI 流程中发挥得很好。现在我们需要强制用户再次选择文件。所以我假设这是在最近的 chrome 更新中引入的。

这是代码的简化片段:

 <html>
<head>
        <script type='text/javascript'>
        document.addEventListener("DOMContentLoaded", function(){

                const button = document.querySelector('#btnSubmit');

                button.addEventListener('click', () => {
                        const form = new FormData(document.querySelector('#theForm'));
                        const url = '/my-api'
                        const request = new Request(url, {
                                method: 'POST',
                                body: form
                        });

                        fetch(request).then(function() {
                                console.log("ok");
                        }).catch(function(err) {
                                console.log(err);
                        });
                });
        });
        </script>

</head>
<body>
        <form enctype="multipart/form-data" action="" method="post" id='theForm'>
                <input type="file" name="csvfile" id="csvfile" value="" /></td>
                <input type="button" name="uploadCSV" value="Upload" id='btnSubmit'/>
        </form>
</body>
</html>

编辑:该错误在 bugs.chromium.org 上标记为 WontFix: https ://bugs.chromium.org/p/chromium/issues/detail?id=1086707#c7

原文由 Martin Taleski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
1 个回答

一个快速的解决方法是将 complete 参数包含到 AJAX 调用(或任何等效的 finally 调用总是被调用)并添加重置表单的代码。我注意到再次附加文件可以解决问题。虽然我明白这不是问题的真正解决方案,但它确实提供了处理或避免该错误的方法。

这样,如果用户出于任何原因需要重新上传文件,他们将不得不重新选择文件。

示例如下:

 $.ajax({
    url: this.action,
    type: this.method,
    data: this.data,
    success: function (response) {
        // success scenario
    },
    error: function (result) {
        // error scenario
    },
    complete: function (data) {
        $('#uploadForm')[0].reset(); // this will reset the form fields
    }
});

原文由 Duck Ling 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题