【问题标题】:Php exec and return binaryphp exec 并返回二进制文件
【发布时间】:2010-10-20 19:47:31
【问题描述】:

我正在尝试在 php 中运行以下内容

$test = svn cat ....

现在$test的输出基本上是一个svn返回的二进制文件。如何使这个二进制文件可供下载。我试图提出以下内容:

$test = `svn cat ....`
header("Content-Disposition: attachment; filename=" . urlencode($filename));
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
echo $test;

【问题讨论】:

    标签: php binary


    【解决方案1】:

    来自the commentspassthru() 上 PHP.net 的文档:

    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"myfile.zip\"");
    header("Content-Length: 11111");
    passthru("cat myfile.zip",$err);
    exit();
    

    以上代码由 igor 在 bboy dot ru 提供。

    【讨论】:

      【解决方案2】:

      您是否考虑过将此文件保存到硬盘上的临时位置并从那里提供服务?真的有必要从内存中提供文件吗?如果您有 500 人下载此文件怎么办。当用户下载它们时,服务器会将所有 500 个文件保存在内存中吗?

      我的建议是,将文件保存到您的网络服务器可以访问的临时位置并给他们一个链接。

      【讨论】:

        【解决方案3】:

        除了彼得 D 的回答;您可以将二进制文件写入文件系统,然后将其作为下载提供。而不是给用户一个链接。

        如果可行,请先尝试使用简单的文本文件;用你的二进制文件试试。

        【讨论】:

          【解决方案4】:

          您可能想在 PHP 中使用passthru() 函数。

          调用可能需要在标头之后进行,但请先尝试两种方式。

          编辑:我认为这不会导致内存问题。我认为 PHP 不会将输出保存在内存中,因为它会直接发送到标准输出。

          【讨论】:

            【解决方案5】:

            问题可能是你有三个内容类型的标题 - 据我所知,浏览器只接受一个,所以我会选择八位字节流。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-07-05
              • 2014-12-01
              • 2019-01-26
              • 1970-01-01
              • 1970-01-01
              • 2019-01-31
              • 1970-01-01
              相关资源
              最近更新 更多