在 CakePHP 2 中下载动态生成的 PNG
Download dynamically generated PNG in CakePHP 2
我有一个动态生成的二维码 PNG。我可以通过转到 www.example.com/events/qrgen
来访问它,这会使其在浏览器中正确显示。
现在,我想要另一个下载 PNG 文件的选项。这是我尝试过的:
// this action displays a QR code in the browser
public function qrgen() {
$this->layout = false;
$this->response->type('image/png');
}
// this action SHOULD make the png download
public function download_qrgen() {
$qrUrl = Router::url(['controller'=>'events', 'action'=>'qrgen']);
$this->response->file($qrUrl, ['download'=>true, 'name'=>'qr']);
return $this->response;
}
// in the "qrgen" view
QRcode::png('example value', null, "M", 4, 4);
但是当我访问 www.example.com/events/download_qrgen
时,它给出错误“找不到该页面”,并将 CakeResponse->file(string, array)
值显示为:/var/www/example.com//events/qrgen
.
如果我在我的 webroot 中尝试一个文件,它会正确下载该文件。但我似乎无法让它下载这样一个动态生成的 png。
CakeResponse::file()
需要传递给它的文件系统路径,而不是 URL,它不会发出任何 HTTP 请求来获取数据。
您必须自己获取数据,然后将其缓冲到一个临时文件中,您可以将其在文件系统中的路径传递给 CakeResponse::file()
:
public function download_qrgen() {
$this->layout = false;
$qrcodeData = $this->_getViewObject()->render('qrgen');
$temp = tmpfile();
fwrite($temp, $qrcodeData);
$filePath = stream_get_meta_data($temp)['uri'];
$this->response->file($filePath, ['download' => true, 'name' => 'qr.png']);
return $this->response;
}
或者您使用数据和 headers 自己准备响应:
public function download_qrgen() {
$this->layout = false;
$qrcodeData = $this->_getViewObject()->render('qrgen');
$this->response->type('image/png');
$this->response->download('qr.png');
$this->response->length(strlen($qrcodeData));
$this->response->header('Content-Transfer-Encoding', 'binary');
$this->response->body($qrcodeData);
return $this->response;
}
另见
我有一个动态生成的二维码 PNG。我可以通过转到 www.example.com/events/qrgen
来访问它,这会使其在浏览器中正确显示。
现在,我想要另一个下载 PNG 文件的选项。这是我尝试过的:
// this action displays a QR code in the browser
public function qrgen() {
$this->layout = false;
$this->response->type('image/png');
}
// this action SHOULD make the png download
public function download_qrgen() {
$qrUrl = Router::url(['controller'=>'events', 'action'=>'qrgen']);
$this->response->file($qrUrl, ['download'=>true, 'name'=>'qr']);
return $this->response;
}
// in the "qrgen" view
QRcode::png('example value', null, "M", 4, 4);
但是当我访问 www.example.com/events/download_qrgen
时,它给出错误“找不到该页面”,并将 CakeResponse->file(string, array)
值显示为:/var/www/example.com//events/qrgen
.
如果我在我的 webroot 中尝试一个文件,它会正确下载该文件。但我似乎无法让它下载这样一个动态生成的 png。
CakeResponse::file()
需要传递给它的文件系统路径,而不是 URL,它不会发出任何 HTTP 请求来获取数据。
您必须自己获取数据,然后将其缓冲到一个临时文件中,您可以将其在文件系统中的路径传递给 CakeResponse::file()
:
public function download_qrgen() {
$this->layout = false;
$qrcodeData = $this->_getViewObject()->render('qrgen');
$temp = tmpfile();
fwrite($temp, $qrcodeData);
$filePath = stream_get_meta_data($temp)['uri'];
$this->response->file($filePath, ['download' => true, 'name' => 'qr.png']);
return $this->response;
}
或者您使用数据和 headers 自己准备响应:
public function download_qrgen() {
$this->layout = false;
$qrcodeData = $this->_getViewObject()->render('qrgen');
$this->response->type('image/png');
$this->response->download('qr.png');
$this->response->length(strlen($qrcodeData));
$this->response->header('Content-Transfer-Encoding', 'binary');
$this->response->body($qrcodeData);
return $this->response;
}
另见