Поврежденная загрузка двоичных файлов с помощью ajax

#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-код, чтобы получить сведения о файле из идентификатора и возвращать сообщения об ошибках (в еще не написанном коде).