使用PHP在$ _POST中发送文件内容

时间:2009-10-29 21:06:09

标签: php file

我正在开发一个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摘要来检查传输是否正常。并且要发送的文件的大小永远不会超过3Mb。

提前感谢您的所有答案。

3 个答案:

答案 0 :(得分: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 :(得分:1)

一个可能的缺点是base64编码将显着增加整体传输大小。压缩会有所帮助,但base64将比压缩文件大小增加33%的开销。

除此之外,我不认为这两种方法之间会有很大差异。

答案 2 :(得分:0)

base64编码使你的文件大小增加了33%(根据下面的评论)。此外,您必须一次性将整个文件加载到内存中。

如果你利用了正常的文件上传方法,那么这些问题都不应该成为一个问题。

相关问题