【问题标题】:Download file from Slim Framework 2.4从 Slim Framework 2.4 下载文件
【发布时间】:2014-05-19 15:26:51
【问题描述】:

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

预期用途是该文件将是:

http://api.test.com/item/123.json

http://api.test.com/item/123.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 代码,其中我声明的标头未发送到浏览器。相反,我得到了文本/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->data) 但是工作正常。

【问题讨论】:

  • 我无法在 Slim 2.4.0 或 2.4.3 中重现您的问题。如果您能够使用最新版本的 Slim 而您还没有,我强烈建议您升级。

标签: php json pdf slim


【解决方案1】:

问题解决了。原来是一个包含空格的 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);

【讨论】:

  • 我按照你的方法。它可以工作,但在下载文件后浏览器挂起。有什么想法吗?
  • 我已经编辑了我的答案。 Se 那里的标题。它可能与您有关。
  • 谢谢。我试试看。
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
相关资源
最近更新 更多