хотя я нашел ответ здесь: Обслуживание файлов .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-файле были скрыты два пробела.
Исправлена проблема.
//
» перед header
и readfile-statements
echo "test";
после readfile-statement.