を使用して、ユーザーが 1 つ以上のファイルをアップロードできるファイル アップローダーを実装していますXMLHttpRequest
。アップロードの進行状況に関する視覚的なフィードバックをユーザーに提供できるようにする必要があるため、使用していません。fetch
私が抱えている問題は、アップロードが完了する前にサーバーがアップロードの処理を停止したときに発生します (たとえば、413 Payload Too Large
アップロードされているファイルが大きすぎる場合、エラーで接続を閉じます)。Safari や Chrome を使用しているときにこのようなエラーが発生すると、意図したとおりにアップロードが中断されます。
ただし、Firefox では、これを無視しているように見え、停止する前にアップロードを数回再試行します。
私のコードは次のとおりです。
// Initialize a new request object.
let req = new XMLHttpRequest();
// Set expected response as JSON.
req.responseType = 'json';
// Set event handlers.
req.upload.onreadystatechange = function(e) { console.log(e.type); }
req.upload.onuploadstart = function(e) { console.log(e.type); }
req.upload.onprogress = function(e) { console.log(e.type); }
req.upload.onabort = function(e) { console.log(e.type); }
req.upload.onload = function(e) { console.log(e.type); }
req.upload.ontimeout = function(e) { console.log(e.type); }
req.upload.onuploadend = function(e) { console.log(e.type); }
// Open request, set request header.
req.open('POST', '/some-endpoint', true);
req.setRequestHeader('Content-type', 'multipart/form-data;boundary=---some-boundary---');
// Create FormData object to submit.
let fd = new FormData(formElement);
// Send data.
req.send(fd);
Safari と Chrome で、サーバーが受け入れるには大きすぎるファイルをアップロードすると、サーバーは 413 ステータス応答で接続を閉じます。イベントは次の順序で発生します。
loadstart
progress (multiple)
Failed to load resource (413 Request Entity Too Large)
私の期待通りに。Firefox では、イベントは次の順序で発生します。
loadstart
progress (multiple, ignoring connection closes and restarting upload multiple times)
loadend
ドキュメントに示されているように、Firefox はイベントの前に、、、、またはイベントload
をerror
発生abort
させないようです。timeout
loadend
XMLHttpRequest.upload
各ブラウザの開発ツールのネットワーク タブを見ると、Chrome と Safari の両方がサーバーが 413 で応答したことを認識していますが、Firefox は応答ステータスを認識していません (その後でもloadend
)。
バージョンは Firefox Quantum 62.0b3 (64 ビット) です。サファリは11.0.1です。Chrome は 67.0.3396.99 です。
問題は、アップロード中にサーバー エラーが発生したことを Firefox が認識できず、アップロードをキャンセルできないのはなぜですか? これを解決する方法はありますか?