2014-04-07 61 views
2

我想讓用戶在Slim php框架中下載文件。從Slim Framework 2.4下載文件

預期用途是,該文件將是:

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; 

以下是我目前(非工作)修身代碼,我宣佈頭不會被髮送到瀏覽器。相反,我得到文本/ HTML。 (請注意,這個例子只包含一個頭文件,我也測試過是否有其他頭文件操作會導致任何影響,但它沒有)。 json/pdf/xml的開關盒稍後會被添加。

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)然而工作正常。

+0

我無法重現您的問題修身2.4.0或2.4.3。如果你能夠使用Slim的最新版本,而你還沒有,我強烈建議升級。 –

回答

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); 
+0

我遵循你的方法。它可以工作,但是在文件下載後掛起瀏覽器。任何想法? –

+1

我編輯了我的答案。在那裏的標題。這可能與你的東西有關。 – olearos

+0

謝謝。我會試一試。 –