.exe-файл повреждается при загрузке с сервера


Во-первых: я скромный веб-дизайнер, который знает ровно столько PHP, чтобы быть опасным, и ровно столько об администрировании сервера, чтобы быть, ну, ничем. Я, вероятно, не пойму вас, если вы не будете очень ясны!

Настройка: Я создал веб-сайт, на котором клиент загружает файлы в определенный каталог, и эти файлы становятся доступными через php для загрузки пользователями. Файлы, как правило, являются исполняемыми файлами размером более 50 МБ. Клиент не хочет, чтобы они были застегнуты на молнию, так как они чувствуют их пользователи недостаточно сообразительны, чтобы распаковать их. Я использую php ниже, чтобы вызвать диалоговое окно загрузки и скрыть каталог, в котором находятся файлы.

Это сервер Linux, если это имеет значение.

Проблема: Существует определенный файл, который становится поврежденным после того, как пользователь пытается его загрузить. Это исполняемый файл, но при нажатии на него открывается пустое окно DOS. Исходный файл перед загрузкой открывается идеально. Есть несколько других подобных файлов они проходят ту же самую процедуру загрузки, и все они работают просто отлично.

Вещи, которые я пробовал: я пытался загрузить файл в сжатом виде, затем разархивировать его на сервере, чтобы убедиться, что он не поврежден во время загрузки, и не повезло.
Я также сравнил двоичный код исходного файла с загруженным файлом, который не работает, и они точно такие же (поэтому php случайно не вставляет в файл ничего лишнего).

Может ли это быть проблема с заголовками в моей функции загрузки файлов? Я действительно не уверен, как устранить эту проблему...

Это php для загрузки, если это уместно (имя файла $ определено в другом месте):

downloadFile("../DIRECTORY/files/$filenamereplace","$filenamereplace");

function downloadFile($file,$filename){    
    if(file_exists($file)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="'.$filename.'"');
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        @ flush();
        readfile($file);
        exit;
    }
}

Дополнительная информация о времени прибытия: - Тесты для рабочих/нерабочих файлов были выполнены на одной и той же машине - Если это имеет какое-либо значение, в исходном файле есть пользовательский значок. После загрузки файл имеет общий значок пустого документа.

Дополнительная информация: Я ДУМАЮ, ЧТО ЭТО ОДИН ИЗ НИХ ВАЖЕН! Я просто попытался загрузить файл напрямую (чтобы обойти ссылку для загрузки, которая запускает функцию загрузки выше). Если я загружу файл, просто перейдя по его URL-адресу и загрузив его таким образом, загруженный файл БУДЕТ РАБОТАТЬ. Поэтому я думаю, что это должно быть как-то связано с функцией загрузки. Но что??

3/17 СЕРЬЕЗНАЯ КОРРЕКЦИЯ - И РЕШЕНА - Итак, я проснулся сегодня утром, и меня осенило, что, возможно, я неправильно сравнивал файлы. (Я заново сохранил их в виде двоичного текста, и затем сравнил их. Я не понимал, что программа сравнения будет брать и сравнивать фактические исполняемые файлы). Этим утром я попытался сравнить фактические исполняемые файлы, и там есть разница. Была одна строка php-кода, которая вводилась в первую строку файла. Я настроил php, и проблема была устранена. (Это было из инструкции if/else, которая определила переменную $filenamereplace в коде, который я процитировал). Еще раз спасибо за все ваши помогите, и извините, что ввел вас в заблуждение, настаивая на том, что содержимое файлов было идентичным!

Author: Kerri, 2010-03-17

2 answers

"Я также сравнил двоичный код исходного файла с загруженным файлом, который не работает, и они точно такие же (поэтому php случайно не вставляет ничего лишнего в файл)".

Если это действительно так, то проблема, должно быть, в том, как запускается исполняемый файл после его загрузки. Это, безусловно, не должно быть проблемой с вашим PHP-кодом.

 3
Author: Bart van Heukelom, 2010-03-16 21:12:38

Возможно, они были повреждены при загрузке. Это может произойти, если вы передадите их по FTP в режиме ASCII вместо ДВОИЧНОГО.

 3
Author: Ignacio Vazquez-Abrams, 2010-03-16 21:08:49