2009-10-29 4 views
1

Я разрабатываю скрипт 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

Я обнаружил, что метод 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

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

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

+3

Как я отметил Фрэнку, base64 добавляет ровно 33%. Он кодирует 3 байта как 4. Здесь нет никаких догадок. –

0

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

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

+1

base64 имеет накладные расходы. Размер файла увеличивается на 33%. Это так просто и предсказуемо. Говорить, что это увеличивает «несколько раз», вводит в заблуждение и неверно. –

+0

Достаточно честный. Будет редактировать, чтобы это отразить. –

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