从Slim Framework 2.4下载文件

时间:2014-04-07 11:47:07

标签: php json pdf slim

我试图让用户在Slim php框架中下载文件。

预期用途是文件为:

http://api.test.com/item/123.json< - 返回带数据的json字符串

http://api.test.com/item/123.pdf< - 使用人类可读的数据表示下载pdf文件

我有生成PDF的代码,但我需要的是让Slim发送正确的标题,以便下载文件。

以下是我对现有系统(工作)的代码:

header("Pragma: public");
header('Content-disposition: attachment; filename='.$f->name);
header('Content-type: ' .$f->type);
header('Content-Transfer-Encoding: binary');
echo $f->data;

以下是我当前(非工作)的Slim代码,其中我声明的标头未发送到浏览器。相反,我得到text / html。 (请注意,此示例仅包含一个标头,我还测试了是否有任何其他标头操作会导致任何效果,但它没有)。稍后将添加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->数据)但工作正常。

1 个答案:

答案 0 :(得分:3)

问题解决了。原来是一个包含空格的php类。我想这搞砸了标题。

通过创建一个新的空项目来解决,并逐步包括直到坏类显示。

在Slim函数中设置标题的工作解决方案;

<?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的标题:

$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);