Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP下载文件不';当函数被另一个函数调用时,该函数不工作_Php_Cakephp_File Transfer - Fatal编程技术网

CakePHP下载文件不';当函数被另一个函数调用时,该函数不工作

CakePHP下载文件不';当函数被另一个函数调用时,该函数不工作,php,cakephp,file-transfer,Php,Cakephp,File Transfer,在我的控制器中,我有一个名为get的函数,它向客户端发送一个文件。当用户单击调用get函数的链接时,它会正常工作。 我有另一个名为get_veeva的函数,它首先将文件从veeva下载到服务器,然后调用get函数将文件发送给用户。这不能正常工作。get_veeva正确下载文件,调用get,但用户没有收到文件,而我只得到一个空白页面。我知道文件权限和所有权不是问题,因为我已经通过将veeva文件硬编码到get中的媒体类参数并使用第一种方法直接点击get进行了测试。这两个函数都没有视图。以下是两个功

在我的控制器中,我有一个名为get的函数,它向客户端发送一个文件。当用户单击调用get函数的链接时,它会正常工作。 我有另一个名为get_veeva的函数,它首先将文件从veeva下载到服务器,然后调用get函数将文件发送给用户。这不能正常工作。get_veeva正确下载文件,调用get,但用户没有收到文件,而我只得到一个空白页面。我知道文件权限和所有权不是问题,因为我已经通过将veeva文件硬编码到get中的媒体类参数并使用第一种方法直接点击get进行了测试。这两个函数都没有视图。以下是两个功能:

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函数只有在由用户直接调用而不是由其他函数调用时才能正常运行。但这些只是猜测。我无法使用CakerResponse,因为我正在运行Cake 2.2.5版


我需要尽快为我的客户解决这个问题,如果有人能帮我,我会非常感激。

当禁用自动渲染(
$this->autoRender=false;
)时,您必须在某个时候调用

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

    // ...

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

    $this->render();
}