我们有一个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和插槽中的数据流异步将数据发送到用户的浏览器?
答案 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);
?>