У меня есть простой код, который отправляет файлы на сервер от https://app.myserver:4202
до https://myserver/backend/upload.php
:
//script executed on`https://app.myserver:4202`
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://myserver.com/backend/upload.php");
xhr.withCredentials = true;
xhr.send(fd); //fd is formdata from file input
ууу, он успешно отправляет файлы с cookie, чтобы я мог выполнить аутентификацию пользователя в своем скрипте upload.php. Теперь я также хочу отобразить индикатор выполнения, поэтому я изменил код так:
var xhr = new XMLHttpRequest();
xhr.open("POST", "https://myserver.com/backend/upload.php");
xhr.withCredentials = true;
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
console.log("add upload event-listener" + evt.loaded + "/" + evt.total);
}
}, true);
xhr.send(fd);
Вау, весь ад вырвался на свободу! У нас есть проблема с CORS. Обратите внимание, что я добавил только трекер прогресса.
Access to XMLHttpRequest at 'https://myserver/backend/upload.php' from origin 'https://myserver:4202' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
Я позаботился о правильной настройке CORS, так что это myserver
заголовки ответа, относящиеся к CORS
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: origin, x-requested-with, content-type
Access-Control-Allow-Methods: DELETE, HEAD, GET, OPTIONS, POST, PUT
Access-Control-Allow-Origin: https://app.myserver.com:4202
Access-Control-Max-Age: 86400
Они работают хорошо, если информация о прогрессе не требуется, но не работают, когда она отслеживается.
Так скажи мне, что мне здесь не хватает?