Я работаю над приложением angular 4, в котором у меня есть требование загрузить файл в форму отправки, для этого я использую плагин ng2-file-upload. Но я столкнулся с проблемой загрузки файла. Я создаю файл upload.php, завершающий процесс загрузки.
Upload.php выглядит следующим образом:
header("Access-Control-Allow-Origin: http://localhost:4200");
header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(array('status' => false));
exit;
}
$path = 'uploads/';
if (isset($_FILES['file'])) {
$originalName = $_FILES['file']['name'];
$ext = '.'.pathinfo($originalName, PATHINFO_EXTENSION);
$generatedName = md5($_FILES['file']['tmp_name']).$ext;
$filePath = $path.$generatedName;
if (!is_writable($path)) {
echo json_encode(array(
'status' => false,
'msg' => 'Destination directory not writable.'
));
exit;
}
if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) {
echo json_encode(array(
'status' => true,
'originalName' => $originalName,
'generatedName' => $generatedName
));
}
}
else {
echo json_encode(
array('status' => false, 'msg' => 'No file uploaded.')
);
exit;
}
Но я получил следующую ошибку:
Ошибка загрузки Http: //localhost/uploads/uploads.php: Ответ на
предварительный запрос не проходит проверку контроля доступа: значение
Заголовок «Access-Control-Allow-Credentials» в ответе «», который
должно быть ‘true’, когда режим учетных данных запроса ‘include’.
ПроисхождениеHTTP: // локальный: 4200Поэтому не допускается доступ.
режим учетных данных запросов, инициированных XMLHttpRequest,
контролируется атрибутом withCredentials.
Если какая-либо помощь, пожалуйста, предложите мне, спасибо заранее!
Это вопрос безопасности браузера, а не Angular. Когда вы делаете междоменный запрос AJAX, если вы хотите отправить куки (в основном, информацию об авторизации), браузеры требуют, чтобы вы указали Access-Control-Allow-Credentials
с true
, указывая, что внешний домен позволяет это. Причина этих двух заголовков в том, что сайт может разрешать запросы AJAX из другого домена, но, возможно, они не хотят, чтобы этот домен использовал какие-либо потенциальные куки авторизации в браузере.
В качестве примера того, что влечет за собой этот риск, вы можете написать приложение для доступа к API Facebook через AJAX. Но если Facebook разрешил вам отправлять файлы cookie, которые могут существовать в браузере, вы можете создавать публикации, как если бы вы были аутентифицированным пользователем, что, конечно же, запрещено. Запретив отправку существующих файлов cookie, пользователь должен предоставить вашему приложению свои учетные данные Facebook, чтобы что-то сделать от своего имени.
В дополнение к этой проверке отправка файлов cookie через XMLHttp также не работает, если Access-Control-Allow-Origin
установлен на «*». Домены должны быть явно добавлены, чтобы гарантировать, что вы не дадите доступ к потенциально опасным сайтам.
Других решений пока нет …