我的文件有UTF-8(希腊语)字符,我无法下载。我正在使用laravel 4.这是我的代码:
//下载
Route::get('file/download', function()
{
$file = 'uploads/πτυχιακή.odt';
return Response::download($file);
});
我收到以下错误(invalidArgumentException)消息:文件名回退必须只包含ASCII字符
有关如何解决该问题的任何想法......?
答案 0 :(得分:9)
这是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中,您可以扩展 \ Illuminate \ Routing \ ResponseFactory 类并覆盖 download()方法。然后,在 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']);
});
这样做,您可以使用默认方法( Response :: json(), respose() - > view()等)和您的自定义方法以同样的方式: Response :: download(),_ response() - >下载
答案 1 :(得分: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>);
这意味着在上载过程中存储文件后需要跟踪原始文件名。这可以通过简化文件名并将原始文件名存储在数据库中,或者通过存储名称编码的文件名来实现,以便将其转换回原始名称。
跟踪数据库中的原始文件名可以简化文件名,使其非常易于识别(例如'hallådär.txt' - &gt;'halla dar.txt')。
但是,使用数据库并不总是一种选择。将UTF-8或ISO-8859-1字符串转换为ASCII的方式有多种,可以将它们转换回来(例如base64_encode / base64_decode,mb_convert_encoding等等,每个都有利有弊(例如,取决于您是否希望能够以可识别的名称存储文件)。