Php 触发ByTestStream上的浏览器文件下载

Php 触发ByTestStream上的浏览器文件下载,php,sockets,zend-framework,browser,download,Php,Sockets,Zend Framework,Browser,Download,我们有一个Java应用服务器和一个PHP网络客户端 我们希望以用户友好的方式将文件从Java服务器传输到客户端 是否可以使用从Java服务器发送的流在浏览器中触发文件下载 如果有帮助的话,通信将通过套接字进行 下面是我在客户端使用Zend框架所做的尝试 观点: <?php $file = $this->filename; $filesize = $this->filesize; header("Content-type: appl

我们有一个Java应用服务器和一个PHP网络客户端

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

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

如果有帮助的话,通信将通过套接字进行

下面是我在客户端使用Zend框架所做的尝试

观点:

<?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->downloadFile($this->fileId,“echo”,$this->filesize)

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

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


有没有一种方法可以使用PHP和套接字中的数据流将数据异步发送到用户的浏览器?

也许您应该看看:

还可以看看php广告中的流,各种I/O流包装器 php://stdinphp://stdoutphp://stderr此处:

您当前使用的文件名表示驱动器上存储的文件

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

因此,Java服务器应该响应webclient,发送一个文件作为响应

Browser -> Webclient -> Java Server
您的Zend控制器操作应该使用一些客户端与Java服务器交互

如果您的Java服务器正在侦听HTTP请求,请使用Zend_HTTP_Client之类的工具获取响应

Browser -> Webclient -> Java Server
Webclient和Java服务器都需要能够流式传输数据

您要做的是,如果浏览器从您的Webclient请求URI,则调用的控制器操作将从Java服务器请求fle作为流

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

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


玩得开心

答案有点简单

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

<?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);
?>

问题是Java服务器是一个监听套接字的应用服务器,不监听http请求,因此出现了问题。但我已经找到了解决办法。