我正在开发一个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。
提前感谢您的所有答案。
答案 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%(根据下面的评论)。此外,您必须一次性将整个文件加载到内存中。
如果你利用了正常的文件上传方法,那么这些问题都不应该成为一个问题。