2010-03-16 3 views
7

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

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

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

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

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

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

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

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; 
    } 
} 

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

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

3/17 MAJOR CORRECTION й RESOLVED- Так что я проснулся сегодня утром, и мне стало ясно, что, возможно, я сравнивал файлы неправильно. (Я сохранил их как двоичный текст, а , затем, по сравнению с ними. Я не понимал, что программа сравнения возьмет и сравнит фактические файлы exe). Сегодня утром я попытался сравнить фактические файлы exe и там - разница. В первую строку файла была введена одна строка php-кода. Я скорректировал php, и проблема была исправлена. (Это было из инструкции if/else, которая определяла переменную $ filenamereplace в коде, который я привел). Еще раз спасибо за вашу помощь и извините за то, что вы вводите вас в заблуждение, настаивая на том, что содержимое файлов идентично!

+0

Я не думаю, что вам нужно очистить заголовки. некоторые шестнадцатеричные редакторы могут сравнивать файлы –

+0

Должен ли я удалить это «@ flush();» линия, то? Может ли промывка заголовков быть причиной проблемы, или вы просто говорите, что это необязательно. (Я, честно говоря, не знаю, что он на самом деле делает) – Kerri

+0

Один бит разъяснения - можете ли вы открыть исходный файл (предварительно загрузить) на том же компьютере, на котором загружена загруженная версия? Просто для того, чтобы устранить любые проблемы, связанные с машиной? Если бит один и тот же, и другие exes загружаются нормально, мне кажется, что вам нужно начать рассмотрение проблем конфигурации среды (например, машины)? – Eric

ответ

3

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

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

+0

Можете ли вы рассказать мне больше о том, что вы подразумеваете под «как exe запускается после его загрузки»? У меня есть контроль над этим с веб-сайта? Благодаря! – Kerri

+0

После загрузки exe его необходимо запустить. Под «как» я подразумеваю, что браузер запускает его, нажимает ли пользователь его в проводнике и т. Д. У вас нет контроля над этим. Это странное место для проблемы, хотя, и вы на 10000% уверены, что файлы двоичные идентичны? –

+0

Файл должен быть дважды щелкнут пользователем для его запуска. Это установочный файл, и процесс установки должен начинаться с момента его нажатия. Вместо этого появляется пустое окно DOS. – Kerri

3

Возможно, они были повреждены при загрузке. Это может произойти, если вы передадите их через FTP в режиме ASCII вместо BINARY.

+0

+1 как я сам себя обманул. – Xetius

+0

«Вещи, которые я пробовал: я попытался загрузить файл на молнию, а затем разархивировать его на сервере, чтобы убедиться, что он не становится поврежденным во время загрузки, и не повезло». – plod

+0

Это была моя первая мысль, на самом деле. Вот почему я попытался загрузить его на сервер сначала в виде заархивированного файла, а затем разархивировать его после его загрузки. Разве это не позволило бы избежать каких-либо проблем с коррупцией для фактического exe-файла при загрузке? (Hah. Plod beat me to it) – Kerri

Смежные вопросы