【发布时间】:2014-02-20 03:23:14
【问题描述】:
我的站点从另一个站点下载文件,然后将该文件发送给客户端,但客户端不发送。
//Downloads file from veeva to server
public function get_veeva($id = null)
{
$this->autoRender = false;
$asset = $this->Asset->findById($id);
$vault = $asset['VeevaVault'];
App::import('Vendor', 'phpVeeva', array('file' => 'veeva' . DS . 'veeva.php'));
$veeva = new phpVeeva();
$file = $veeva->getVeevaAsset($vault['veeva_id'], $vault['title']);
$this->send_veeva($file);
}
//Sends downloaded file to client
public function send_veeva($file)
{
$filename = $file['filename'];
$ext = $file['ext'];
$path = APP . 'tmp/';
if (file_exists($path . $filename . '.' . $ext)) {
echo 'Downloading ' . $filename . '.' . $ext . '...';
//echos /var/www/<sitename>/app/tmp/<filename>.<ext>
$this->viewClass = 'Media';
$params = array(
'id' => sprintf("%s.%s", $filename, $ext),
'name' => sprintf("%s.%s", $filename, $ext),
'download' => true,
'ext' => $ext,
'mimeType' => array(
'doc' => 'application/msword',
'pdf' => 'application/pdf',
'ppt' => 'application/vnd.ms-powerpoint'
),
'path' => APP . "tmp" . DS
);
$this->set($params);
}
else {
echo $filename . '.' . $ext . ' does not exist at ' . $path;
}
}
该文件存在于它应该存在的位置,并且页面回显说它正在下载,但没有弹出下载窗口。我尝试过使用和不使用 mimeType,结果相同。我的 Cake 版本不支持使用 Cake 响应发送文件。
编辑 - 添加 HTTP 标头
查看标题,弹出以下内容:
在响应标头中,当我尝试发送 .doc 文件时,内容长度为 0,内容类型为 text/html,所以我认为它应该是 application/msword。
在请求头中,接受以下内容,text/html,application/xhtml+xml,application/xml。
这是标题:
回复:
HTTP/1.1 200 正常
日期:格林威治标准时间 2014 年 2 月 20 日星期四 16:32:26
服务器:Apache/2.2.15(红帽)
X-Powered-By:PHP/5.3.3
内容长度:0
连接:关闭
内容类型:文本/html; charset=UTF-8
请求:
GET /assets/get_veeva/530566d7-80c4-4ad7-b815-20600a64cb32 HTTP/1.1
主机:guru-dev.selfip.com
用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0
接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
接受语言:en-US,en;q=0.5
接受编码:gzip、deflate
推荐人:http://guru-dev.selfip.com/
Cookie:工具栏显示=隐藏; CAKEPHP=edh8riumsm2kb61ka4dih3v6c1
连接:保持活动
【问题讨论】:
-
有人有什么想法吗?看起来它没有发送正确的 http 标头。