2013-11-20 56 views
3

我的文件有UTF-8(希臘字母)字符,我無法下載它。我使用laravel 4.這裏是我的代碼:laravel 4文件名後備只能包含ASCII字符

//下載

Route::get('file/download', function() 
{ 
$file = 'uploads/πτυχιακή.odt'; 
return Response::download($file); 
}); 

我得到以下錯誤(invalidArgumentException)消息:文件名後備必須只包含ASCII字符

的任何想法如何解決這個問題..?

+2

我會重命名這些文件......讓他們這樣做可能會讓人頭痛不已。 –

+1

Laravel論壇上的同樣問題,除了重命名文件之外,還沒有真正的解決方案。 http://forums.laravel.io/viewtopic.php?pid=61493 – 2013-11-20 15:05:50

回答

8

這是Response :: download函數中的一個錯誤。將其更改爲:

// File: vendor/laravel/framework/src/Illuminate/Support/Facades/Response.php 

public static function download($file, $name = null, array $headers = array(), $disposition = 'attachment') 
{ 
    $response = new BinaryFileResponse($file, 200, $headers, true); 

    if (is_null($name)) 
    { 
     $name = basename($file); 
    } 

    return $response->setContentDisposition($disposition, $name, Str::ascii($name)); 
} 

https://github.com/laravel/framework/pull/4296

Laravel 5

在Laravel 5,可以延長\照亮\路由\ ResponseFactory類和重寫下載()方法。然後,在的ServiceProvider,註冊您的自定義ResponseFactory作爲默認的一個:

// We extends \Illuminate\Routing\ResponseFactory class, that implements Illuminate\Contracts\Routing\ResponseFactory 

$this->app->singleton('Illuminate\Contracts\Routing\ResponseFactory', function ($app) { 
    return new MyCustomResponseFactoryExtendedFromResponseFactory($app['Illuminate\Contracts\View\Factory'], $app['redirect']); 
}); 

這樣做,你可以使用默認的方法(響應:: JSON()respose() - >視圖()等),並以同樣的方式自定義方法:響應::下載(),_response() - >下載

0

正如在http://laravel.com/docs/responses#special-responses指出:

注意:管理文件下載的Symfony HttpFoundation需要 下載的文件具有ASCII文件名。

如果我理解這個正確的,理想情況下,文件名應存放與在上傳過程中的ASCII文件名,然後返回:

return Response::download(<ascii_filename>); 

這是好的,如果它是可以接受的是,文件名不是與上傳時相同。

但是,如果文件名不能再更改文件的下載應該觸發的:

return Response::download(<ascii_filename>, <original_file_name>); 

這意味着,有必要跟蹤原始文件名的上傳過程中存儲的文件後, 。這可以通過簡化文件名並將原始文件名存儲在數據庫中來實現,或者通過將文件名存儲爲可以轉換回其原始名稱的名稱來實現。

保持在數據庫中的原始文件名的軌道使得能夠簡化的文件名,使得它們非常辨認(例如「海拉där.txt」 - >「海拉dar.txt」)。

但是,使用數據庫並不總是一個選項。將UTF-8或ISO-8859-1字符串轉換爲ASCII的方式有多種,可以將它們轉換回來(例如,base64_encode/base64_decode,mb_convert_encoding等),每種方式都有優缺點(例如,取決於if你想能夠以一個可識別的名字存儲文件)。

+0

這個解決方案不起作用,即使通過傳遞一個utf-8名字作爲第二個參數給'downlaod'方法,返回的文件名也會變成別的東西 – alex

相關問題