在字节流上触发浏览器文件下载

时间:2014-06-04 10:45:39

标签: php sockets zend-framework browser download

我们有一个Java应用服务器和一个PHP的webclient。

我们希望以用户友好的方式将文件从Java服务器传输到客户端。

是否可以使用从Java服务器发送的流在浏览器中触发文件下载?

如果可以提供帮助,通信就会通过套接字传递。

这是我在客户端使用Zend Framework尝试的内容。

观点:

<?php 
        $file = $this->filename;
        $filesize = $this->filesize;

      header("Content-type: application/octet-stream\r\n");

      header('Content-Disposition: attachment; filename="'.$file.'"\r\n');
      header("Content-Length:$filesize\r\n");
      header("Accept-Ranges: bytes\r\n");
      header("Cache-Control: private\n\n");
      header("Content-Transfer-Encoding: binary");
      header("Connection: Keep-Alive\r\n");
      ob_clean();
      flush();
      $authNamespace = new Zend_Session_Namespace('Cubbyhole_SockLoader');
      $cl = $authNamespace->CoreLinker;
      $cl->downloadFile($this->fileId, "echo", $this->filesize);
?>
  

$ cl-&gt; downloadFile($ this-&gt; fileId,&#34; echo&#34;,$ this-&gt; filesize);

读取数据流并回显收到的内容,直到文件长度输出为止,然后停止。

问题是,正如可以预料的那样,在触发下载之前,必须回显整个文件,导致PHP方面超时,或者只是一个非常长的加载页面。 然后,当文件在客户端回显时,客户端必须自己下载文件,这并没有真正优化。

有没有办法使用PHP和插槽中的数据流异步将数据发送到用户的浏览器?

2 个答案:

答案 0 :(得分:0)

也许你应该看看:

http://framework.zend.com/manual/1.12/en/zend.http.client.advanced.html#zend.http.client.streaming

Possible to download a file through the Zend HTTP Client?

另请参阅php广告中的各种 I / O Stream Wrappers 之类的流媒体 php:// stdin php:// stdout php:// stderr 此处: http://www.php.net/manual/de/wrappers.php.php

您当前正在使用文件名,该文件名代表驱动器上的存储文件。

您需要做的是,从您的php webclient请求该文件。

因此,您的Java Server应该响应您的webclient,将文件作为响应发送。

Zend Controller Action 应该使用某个客户端与Java Server进行交互。

如果您的Java服务器正在侦听HTTP请求,请使用类似Zend_Http_Client的方法来获取响应。

Browser -> Webclient -> Java Server

Webclient和Java Server都需要能够流式传输数据。

如果浏览器从您的Web客户端请求URI,您将要做的是,被调用的Controller Action将从Java服务器请求文件流。

Webclient将逐位获取php流和代理(转发)文件。

有几种技术可以使用,所以问一个更详细的问题,如果可以,我会尝试回答。

玩得开心!

答案 1 :(得分:0)

答案很简单。

我需要明确地说输出缓冲在发送标头后结束,浏览器将流作为下载源。

<?php 
        $file = $this->filename;
        $filesize = $this->filesize;

      header("Content-type: application/octet-stream\r\n");

      header('Content-Disposition: attachment; filename="'.$file.'"\r\n');
      header("Content-Length:$filesize\r\n");
      header("Accept-Ranges: bytes\r\n");
      header("Cache-Control: private\n\n");
      header("Content-Transfer-Encoding: binary");
      header("Connection: Keep-Alive\r\n");
      ob_clean();
      flush();
      ob_end_flush();//here
      $authNamespace = new Zend_Session_Namespace('Cubbyhole_SockLoader');
      $cl = $authNamespace->CoreLinker;
      $cl->downloadFile($this->fileId, "echo", $this->filesize);
?>