Ошибка совместимости с Windows при загрузке exe-файлов на PHP - PullRequest
1 голос
/ 28 февраля 2012

Я создал страницу с использованием php и mysql, которая требует от пользователя входа в систему для загрузки различных платных программ. Они могут нажать на ссылку, как здесь, и программа загружается и работает правильно.

$c3 = mysql_result($result,$i,"exe");
echo "<a href='$c3'>... etc

Однако свойства RT-click позволяют им видеть путь к этому файлу, поэтому я изменил приведенное выше значение на:

$c3="downloads3.php?link=".mysql_result($result,$i,"exe");

Где downloads3.php выглядит следующим образом:

<?php
$file = $_GET['link'];
$size = filesize($file);
$type = filetype($file);
$path = "../downloads/";
header('Content-Type: $type'); 
header("Content-Transfer-Encoding: Binary");  
header("Content-Disposition: attachment; filename=$path.$file");
header("Content-Length: ".filesize($file)); 
readfile($file_url);?> 
?>

Он находит правильный файл, и я получаю предупреждение системы безопасности, но, в любом случае, нажимая кнопку «Выполнить», он немедленно выдает сообщение об ошибке Windows, что файл не совместим с этой версией Windows. Должно быть что-то в заголовке выше, но не могу понять, что. Пробовал различные перестановки.

Какие-нибудь блестящие идеи, или заставить работать вышеупомянутое или другие способы скрыть исходный путь? Спасибо.

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Лучшее решение для загрузки файла с любым именем, которое вы хотите

function force_download($filename = '', $data = '')
{
    if ($filename == '' OR $data == '')
    {
        return FALSE;
    }

    // Try to determine if the filename includes a file extension.
    // We need it in order to set the MIME type
    if (FALSE === strpos($filename, '.'))
    {
        return FALSE;
    }

    // Grab the file extension
    $x = explode('.', $filename);
    $extension = end($x);

    // Load the mime types
    if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes'.EXT))
    {
        include(APPPATH.'config/'.ENVIRONMENT.'/mimes'.EXT);
    }
    elseif (is_file(APPPATH.'config/mimes'.EXT))
    {
        include(APPPATH.'config/mimes'.EXT);
    }

    // Set a default mime if we can't find it
    if ( ! isset($mimes[$extension]))
    {
        $mime = 'application/octet-stream';
    }
    else
    {
        $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
    }

    // Generate the server headers
    if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE)
    {
        header('Content-Type: "'.$mime.'"');
        header('Content-Disposition: attachment; filename="'.$filename.'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header("Content-Transfer-Encoding: binary");
        header('Pragma: public');
        header("Content-Length: ".strlen($data));
    }
    else
    {
        header('Content-Type: "'.$mime.'"');
        header('Content-Disposition: attachment; filename="'.$filename.'"');
        header("Content-Transfer-Encoding: binary");
        header('Expires: 0');
        header('Pragma: no-cache');
        header("Content-Length: ".strlen($data));
    }

    exit($data);
}

$data = 'Here is some text!';
$name = 'mytext.txt';

force_download($name, $data); 
1 голос
/ 28 февраля 2012

Скорее всего, EXE-файл поврежден из-за неожиданного вывода.Ваш файл downloads3.php имеет дополнительный вывод, который будет отображаться при загрузке:

readfile($file_url);?> //PHP stops parsing here 
?> //output "\n?>"

Сам заголовок PE сообщает Windows, в каких версиях он может работать, поэтому, если какие-либо ошибки будут сгенерированы до отправки файла,они появятся в том месте, где Windows ожидает заголовок.

Чтобы смягчить это, вы можете удалить дополнительный символ новой строки и ?> в конце файла и отключить создание отчетов об ошибках с помощью error_reporting(0) вверхуфайла.

0 голосов
/ 29 февраля 2012

DOH !!!!!!!!!!!!!!!! Слишком много вырезывания и вставки, этот код имеет действительно глупую ошибку: файл чтения ($ file_url) должен быть файлом чтения ($ file), неудивительно, что мой файл размером 36 МБ после загрузки был всего 1 КБ, он был пустым!

Спасибо за все комментарии, извинения за потраченное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...