Отправка содержимого файла в $ _POST с помощью PHP - PullRequest
1 голос
/ 30 октября 2009

Я разрабатываю скрипт PHP для отправки содержимого файла из одного скрипта в другой. В PHP обычно используется массив $ _FILE, который содержит любой загруженный файл, представленный в форме. Но мне не нужна была форма, поэтому я придумал что-то немного другое:

// pseudo function names ahead

$content = file_get_contents(FILE_TO_SEND);
send_file_with_curl(base64_encode(gzcompress($content)));

Таким образом, это в основном выбирает содержимое файла, затем сжимает его с помощью сжатия gzip и затем base64 кодирует его. Затем все отправляется с запросом cURL POST. С другой стороны, мне отправляют контент base64, декодируют его, распаковывают, и все возвращается без изменений.

Итак, мой вопрос: есть ли недостатки в том, чтобы так поступать? Могу ли я пропустить какие-либо проблемы безопасности или целостности?

Я забыл упомянуть, что я также отправляю дайджест файла md5, чтобы проверить, прошла ли передача нормально. Размер отправляемых файлов никогда не будет превышать 3 МБ.

Заранее благодарим за все ваши ответы.

Ответы [ 3 ]

3 голосов
/ 30 октября 2009

Я обнаружил, что метод HTTP PUT хорош для подобных вещей. Вам, конечно, не нужно кодировать файл, и, скорее всего, не следует беспокоиться о сжатии и т. Д. Практического ограничения размера не существует. Он быстрый и использует фиксированный объем памяти независимо от размера файла.


Эта функция будет HTTP PUT файл с локального диска на удаленный URL

//Specify the location of a tmp file
function PutFile($sName, $sFile)
{
    $URL = "http://MY-SERVER/PutFile.php?FileName=" . urlencode($sName);

    $FILE = fopen($sFile, 'rb');

    $curl = curl_init($URL);
    curl_setopt($curl, CURLOPT_HEADER,0);
    curl_setopt($curl, CURLOPT_PUT, 1);
    curl_setopt($curl, CURLOPT_INFILE, $FILE);

    ob_start();
        curl_exec($curl);
        $sReturn = ob_get_contents();
    ob_end_clean();

    curl_close($curl);

    fclose($FILE);

    return $sReturn;
}

На удаленном конце это PutFile.php

<?php

$Name = (get and **validate** file name from $_GET['FileName'];
$Path = /somewhere/to/put/the/file/ + $Name

set_time_limit(3);

$f1 = fopen('php://input', 'rb');
$f2 = fopen($Path, 'wb');

while($data = fread($f1, 4096))
{
    fwrite($f2, $data);
}

fclose($f1);
fclose($f2);

echo "Success\n";

Если вы не хотите записывать его на диск, а работаете с ним в памяти, вы можете просто использовать file_get_contents('php://stdin').

1 голос
/ 30 октября 2009

Одним из возможных недостатков является то, что кодировка base64 значительно увеличит общий размер передачи. Сжатие поможет, но base64 увеличит накладные расходы на 33% по сравнению с размером сжатого файла.

Кроме того, я не думаю, что между этими двумя методами будет большая разница.

0 голосов
/ 30 октября 2009

Это кодирование base64 увеличивает размер вашего файла на 33% (согласно комментарию ниже). Кроме того, вы должны загрузить весь файл в память сразу.

Если вы воспользовались обычным методом загрузки файлов, ни одна из этих проблем не должна вызывать беспокойства.

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