当另一个函数调用函数时,CakePHP下载文件不起作用

时间:2014-02-23 08:44:25

标签: php cakephp file-transfer

在我的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版。

我需要很快为我的客户工作,所以如果有人可以提供帮助,我真的很感激。

1 个答案:

答案 0 :(得分:0)

禁用自动呈现功能($this->autoRender = false;)时,您必须在某个时候致电Controller::render()

public function get_veeva($id = null)
{
    $this->autoRender = false;

    // ...

    $this->get($filename, $ext, $filename, $mime);

    $this->render();
}