#php #jquery #ajax
Вопрос:
Несколько вопросов здесь очень полезно обсуждают загрузку двоичных файлов с помощью jQuery и Ajax. Мои файлы загружаются, но повреждены. Те, которые я тестирую, относятся к типу MS docx, но они поступают с разным содержимым и размерами к оригиналу с байтами заголовка спецификации с префиксом EF BB BF, что, я думаю, означает, что где-то в пути что-то пытается преобразовать их в UTF8.
Протестируйте PHP-код:
$id = json_decode(filter_input(INPUT_POST, 'downloadfile', FILTER_SANITIZE_STRING);
getFileData($pdo, $fileData, $id); // from database
$file = file_get_contents($fileData['file_location']);
header('Content-type: application/octet-stream');
header("Content-Transfer-Encoding: binary");
echo $file;
jQuery (я использую v3.6.0):
$('#dodownload').on('click', function() {
$.ajax({
type: 'POST',
data: {'downloadfile': id},
xhrFields: {responseType: 'blob'},
url: '/php/ajax/fbdownload-ajax.php',
})
.done(function(blob, status, xhr){
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="testfile.docx";
link.click();
});
})
jQuery говорит blob
, что это » большой двоичный объект {размер: 14403, тип: «приложение/октетный поток»», status
это «успех» и xhr.readyState
равно 4.
Как предотвратить повреждение файла?
Комментарии:
1. На самом деле для этого вам не нужен ajax. При нажатии просто перенаправьте браузер
/php/ajax/fbdownload-ajax.php
, и он автоматически загрузит файл для вас (при условии, что php устанавливает правильные заголовки для загрузки файла).2. Вы сохранили свой PHP-скрипт без спецификации?
3. @CBroe: Ты нашел это. Спасибо. Удаление символов спецификации из файла PHP устраняет проблему. Несколько раз ударяется головой о клавиатуру …. Справляется с работой.
4. @Justinas: верно, но мне нужен промежуточный PHP-код, чтобы получить сведения о файле из идентификатора и возвращать сообщения об ошибках (в еще не написанном коде).