在我的Controller中,我有一个名为get的函数,它向客户端发送一个文件。当用户单击调用get函数的链接时,它可以正常工作。 我有另一个名为get_veeva的函数,它首先将文件从veeva下载到服务器,然后调用get函数将文件发送给用户。这不能正常工作。 get_veeva正确下载文件,调用get,但用户没有收到文件,而只是得到一个空白页面。我知道文件权限和所有权不是问题,因为我已经通过将veeva文件硬编码到get和hitting中的媒体类参数来测试直接使用第一种方法。这两个函数都没有View。以下是两个功能:
function get($name, $ext, $original_name, $mime)
{
$this->viewClass = 'Media';
$params = array(
'id' => sprintf("%s.%s", $name, $ext),
'name' => basename($original_name, '.' . $ext),
'download' => true,
'ext' => $ext,
'mimeType' => $mime,
'path' => APP . "webroot/uploads" . DS
);
$this->set($params);
}
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']);
$filename = $file['filename'];
$ext = $filename['ext'];
$mime = $filename['mime'];
$this->get($filename, $ext, $filename, $mime);
}
这是下载文件的getVeevaAsset函数:
public function getVeevaAsset($id, $filename)
{
$this->Auth();
$url = self::VVURL . "/objects/documents/" . $id . "/file";
set_time_limit(0);
$path = APP . 'webroot/uploads/';
$info = $this->getInfo($id);
$mime = $info['format__v'];
$ext = $this->extensions[$mime];
$fullFilename = $filename . "." . $ext;
$uri = $path . $fullFilename;
$fp = fopen($uri, 'w+');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/json;charset=UTF-8", "Authorization: ".$this->sessID));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$json_response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($status != 200)
{
die('Error: call to URL $url failed with status "' . $status .'", response "' . $json_response. '", curl_error "' . curl_error($curl) . '", curl_errno "' . curl_errno($curl). '"');
}
curl_close($ch);
fclose($fp);
chmod($uri, 0777);
$file['path'] = $path;
$file['filename'] = $filename;
$file['ext'] = $ext;
$file['mime'] = $mime;
return $file;
}
我在考虑getVeevaAsset函数中是否发生了一些事情,它不能让get运行正常(下载脚本干扰了mediaclass转移?)。或者get函数只有在用户直接调用而不是由其他函数调用时才能正常运行。但这些只是猜测。我不能使用CakeResponse,因为我正在运行Cake 2.2.5版。
我需要很快为我的客户工作,所以如果有人可以提供帮助,我真的很感激。
答案 0 :(得分:0)
禁用自动呈现功能($this->autoRender = false;
)时,您必须在某个时候致电Controller::render()
。
public function get_veeva($id = null)
{
$this->autoRender = false;
// ...
$this->get($filename, $ext, $filename, $mime);
$this->render();
}