使用php:// filter时,将过滤器参数添加到流过滤器

时间:2010-04-06 07:44:16

标签: php stream filtering

我有一个二进制文件,我想转换为标准的MIME兼容base64字符串。我以为我可以使用php://filter方法来过滤流,但我对如何设置“line-length”参数感到困惑。还有其他方法可以实现类似的结果,但我想弄清楚是否:

  1. 如果甚至可以/允许使用URI样式方法为流过滤器设置参数。

  2. 如果可行,如何完成。

  3. 以下是我到目前为止所获得的难题:

    显然,我可以停止尝试幻想而只是简单地说:

    $binary = "path/to/binary.file";
    $mime = file_get_contents($binary);
    $mime = base64_encode($mime);
    $mime = chunk_split($mime);
    

    或者,我可以使用不带php://filter参数的line-length方法,然后将其拆分:

    $binary = "path/to/binary.file";
    $mime = file_get_contents("php://filter/read=convert.base64-encode/resource=$binary");
    $mime = chunk_split($mime);
    

    或者,我可以将fopenstream_filter_append结合使用,根本不使用网址格式(如Conversion Filters手册中所述):

    $binary = "path/to/binary.file";
    $param = array('line-length' => 76, 'line-break-chars' => "\r\n");
    $fp = fopen($binary, 'r');
    stream_filter_append($fp, 'convert.base64-encode',null, $param);
    $mime = fread($fp, filesize($binary));
    fclose($fp);
    

    所以上面所有都给出了相同的结果,但是没有一个是我希望的,那就是在流的同一个URL中添加line-length参数。有点像:

    $mime = file_get_contents("php://filter/read=convert.base64-encode:line-length=76/resource=$binary");
    

    我想问题是当使用stream_filter_append时,参数必须作为数组传递。

    所以有人知道我能做什么吗?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果甚至可以/允许使用URI样式方法为流过滤器设置参数。
  2.   

不幸的是,目前, 1 不可能为这些convert.base64-encode网址提供除过滤器名称之外的任何内容(在您的情况下为php://filter)。

我会采用stream_filter_append方式,用stream_get_contents代替fread(...)

  1. NULL明确使用filterparams php_stream_filter_create参数{{1}}。它不会 2 过多的工作来实现你所建议风格的论证阅读。
  2. 我不是C程序员。