代码之家  ›  专栏  ›  技术社区  ›  rogeriopvl

使用php以$\u post格式发送文件内容

  •  1
  • rogeriopvl  · 技术社区  · 15 年前

    我正在开发一个PHP脚本,将文件的内容从一个脚本发送到另一个脚本。在PHP中,通常使用包含以表单提交的任何上载文件的$_文件数组。但我不需要表格,所以我想出了一些不同的东西:

    // 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 回复  |  直到 15 年前
        1
  •  3
  •   gahooa    15 年前

    我发现http-put方法对于这类事情是很好的。您当然不需要对文件进行编码,而且很可能不需要考虑压缩等问题。以下各项没有实际尺寸限制。它速度很快,无论文件大小如何,都使用固定的内存量。


    此功能将 HTTP投入 从本地磁盘到远程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;
    }
    

    在远端,这是 PPTFIL.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') .

        2
  •  1
  •   Matthew Scharley    15 年前

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

    除此之外,我认为这两种方法不会有很大的区别。

        3
  •  0
  •   Frank Farmer    15 年前

    base64编码使您的文件大小增加了33%(根据下面的注释)。另外,您必须同时将整个文件加载到内存中。

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

    推荐文章