我试图让用户在 Slim php 框架中下载一个文件。
文件的预期用途是:
http://api.test.com/item/123.json <- 返回带有数据的 json 字符串
http://api.test.com/item/123.pdf <- 下载具有人类可读数据表示的 pdf 文件
我有生成 PDF 的代码,但我需要让 Slim 发送正确的 header ,以便下载文件。
这是我为现有系统(工作)编写的以下代码:
header("Pragma: public");
header('Content-disposition: attachment; filename='.$f->name);
header('Content-type: ' .$f->type);
header('Content-Transfer-Encoding: binary');
echo $f->data;
以下是我当前的(非工作)Slim 代码,其中我声明的 header 未发送到浏览器。相反,我得到文本/html。 (请注意,此示例仅包含一个 header ,我还测试过任何其他 header 操作是否会产生任何影响,但没有)。稍后将添加 json/pdf/xml 的 switch-case。
R::setup();
$app = new \Slim\Slim();
$app->get('/item', function() use ($app) {
$f = R::load('file', 123);
$app->response->headers->set("Content-Type", "application/pdf"); //$f->type
$app->response->setBody($f->data);
});
$app->run();
但是 $app->response->setBody($f->data) 工作正常。
最佳答案
问题解决了。原来是一个包含空格的 php 类。我猜这搞砸了标题。
通过创建一个新的空项目并逐步包含直到出现错误类来解决。
在 Slim 函数中设置 header 的工作解决方案;
<?php
require 'vendor/autoload.php';
$app = new \Slim\Slim();
$app->get('/foo', function () use ($app) {
$app->response->headers->set('Content-Type', "application/pdf");
$app->response->setBody("foo");
});
$app->run();
?>
更新:这是我用来让用户下载 PDF 的 header :
$app->response->headers->set('Content-Type', $f->type);
$app->response->headers->set('Pragma', "public");
$app->response->headers->set('Content-disposition:', 'attachment; filename=' . $f->name);
$app->response->headers->set('Content-Transfer-Encoding', 'binary');
$app->response->headers->set('Content-Length', $f->size);
$app->response->setBody($f->data);
关于php - 从 Slim Framework 2.4 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22911530/