Копирование загруженного файла vai PHP HTTP Get in PHP 4 - PullRequest
2 голосов
/ 07 октября 2010

Я работал над добавлением функциональности на сайт, изначально написанный на PHP 4.4.9. Перенос сайта на PHP5 не в их бюджете, так что даже не предлагайте этого. (Хотя это сильно нужно). Проблема, с которой я сталкиваюсь, заключается в том, как скопировать двоичные данные из запроса GET в расположение файла на сервере. Код, который в настоящее время написан для поддержки этого метода, выглядит следующим образом:

function save($path) { 
    $input = fopen("php://input", "r");
    $temp = tmpfile();
    $realSize = stream_copy_to_stream($input, $temp);
    fclose($input);

    if ($realSize != $this->getSize()){            
        return false;
    }

    $target = fopen($path, "w");        
    fseek($temp, 0, SEEK_SET);
    stream_copy_to_stream($temp, $target);
    fclose($target);
}

Проблема, с которой я сталкиваюсь, заключается в том, что функция stream_copy_to_stream поддерживается только в PHP 5. Вот что у меня есть, но кажется, что я создаю только файлы размером 8 КБ, и я не уверен Зачем. Теоретически он должен допускать до 20 млн.

function save($path) {    
    $input = fopen("php://input", "rb");
    $temp = tmpfile();
    fwrite($temp, fread($input, 20971520));
    fclose($input);

    $target = fopen($path, "w");        
    fseek($temp, 0, SEEK_SET);
    #stream_copy_to_stream($temp, $target);
    fwrite($target, fread($temp, 20971520));
    fclose($target);
    echo $path;

    return true;
}

Я удалил проверку размера, потому что я не мог найти способ получить размер файла при чтении. Любая помощь очень ценится в этом. Я буквально часами ломал голову и знаю, что есть кто-то, скорее всего, на стеке, который может ответить на мой вопрос, вероятно, очень легко.

Заранее всем спасибо за помощь!

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

1 Ответ

2 голосов
/ 06 января 2011

Я наткнулся на эту тему в поисках ответа на точно такую ​​же проблему.
Я знаю, что сообщение старое, но выкладываю здесь ответ для всех, кто ищет.
Вы были близки.
fread выводит из потока 8192 байтов за раз. Так что вам придется перебирать, пока он не увидит конец файла.


    function save($path) {    
        $input = fopen("php://input", "rb");
        $temp = tmpfile();
        while(!feof($input))
            fwrite($temp, fread($input, 8192));
        //fwrite($temp, fread($input, 20971520));
        fclose($input);

        $target = fopen($path, "w");        
        fseek($temp, 0, SEEK_SET);
        #stream_copy_to_stream($temp, $target);
        while(!feof($temp))
            fwrite($target, fread($temp, 8192));

        fclose($target);
        echo $path;

        return true;
    }
...