файлы .docx через мой веб-сервер повреждены при открытии

хотя я нашел ответ здесь: Обслуживание файлов .docx через Php Но я все еще получаю ошибку, что файл поврежден при попытке загрузить и открыть сервер docx через php. Возможно, вы видите что-то не так с моим кодом. Файл .doc отлично работает, а docx не работает.

$parts = pathinfo($doc); $docFile = $userDocRoot.$doc; if ( !file_exists($docFile) ){ throw new Exception("Can not find ".$parts ['basename']." on server"); } if ( $parts['extension'] == 'docx' ){ header('Content-type: application/vnd.openxmlformats- officedocument.wordprocessingml.document'); header('Content-Disposition: attachment; filename="'.$parts['basename'].'"'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); ob_clean(); flush(); readfile($docFile); }else{ header('Content-type: application/msword'); header('Content-Disposition: attachment; filename="'.$parts['basename'].'"'); readfile($docFile); } 

Решение для меня заключалось в том, чтобы добавить

  $fsize = filesize($docFile); header("Content-Length: ".$fsize); 

Спасибо всем за помощь

В вашем коде было несколько лишних пробелов, которые могли бы привести к сбою.

Попробуйте использовать этот код:

 $parts = pathinfo($doc); $docFile = $userDocRoot . $doc; if(!file_exists($docFile)){ throw new Exception('Can not find ' . $parts['basename'] . ' on server'); } if($parts['extension'] == 'docx') { header('Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); header('Content-Disposition: attachment; filename="' . $parts['basename'] . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); ob_clean(); flush(); readfile($docFile); } else { header('Content-type: application/msword'); header('Content-Disposition: attachment; filename="' . $parts['basename'] . '"'); readfile($docFile); } 

Если он все еще не работает, попробуйте прокомментировать header и строки readfile , после чего вы увидите, есть ли какие-либо ошибки.

Кроме того, я предлагаю вам проверить имена файлов на «белый список», чтобы люди не могли загружать файлы PHP с паролями в них и т. Д.

Я только что потратил некоторое время на то, почему мои файлы DOCX повреждены и наткнулись на это … но я также нашел ответ в другом месте …

 $fsize = filesize($docFile); header("Content-Length: ".$fsize); 

Это дало мне инструменты для поиска … и ключ в том, что filesize() требует базового имени файла, чтобы получить точный размер файла!

Адаптация моего кода:

 header("Content-Length: ".filesize(basename($file))); 

Теперь я предлагаю DOCX (я установил Content-type в «application / vnd.openxmlformats-officedocument.wordprocessingml.document») по своему усмотрению, и мне не нужно «исправлять» документ, как сообщали другие … (Я также обнаружили, что ремонт работал)

Вот код, который работает для меня (примерно через 5 часов).

  // headers to send your file header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); header("Content-Length: " . filesize($original_file)); header('Content-Disposition: attachment; filename="' . $new_filename . '"'); ob_clean(); flush(); readfile($original_file); exit; 

Я надеюсь, что это помогает 🙂

Я была такая же проблема.

Причина в том, что где-то в моем php-файле были скрыты два пробела.

Исправлена ​​проблема.

  1. Добавьте « // » перед header и readfile-statements
  2. Напишите echo "test"; после readfile-statement.
  3. Затем посмотрите в исходном коде HTML, если перед « тестом » есть пробелы.