// 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']);
});
3条答案
按热度按时间cbjzeqam1#
是Response::download函数中的bug,修改为:
https://github.com/laravel/framework/pull/4296
拉腊维尔5
在Laravel 5中,您可以扩展 \Illuminate\Routing\ResponseFactory 类并覆盖 download() 方法。然后,在 ServiceProvider 中,将您的自定义 ResponseFactory 注册为默认值:
这样,你就可以使用默认方法(Response::json(),respose()-〉view(),等等)和你的自定义方法:* 响应::下载()*,_响应()-〉下载
y1aodyip2#
正如www.example.com中所述http://laravel.com/docs/responses#special-responses:
注:管理文件下载的Symfony HttpFoundation要求下载的文件具有ASCII文件名。
如果我理解正确的话,理想情况下,文件名应该在上传过程中以ASCII文件名存储,然后返回:
如果文件名与上传时的文件名不同是可以接受的,则这是可以接受的。
但是,如果文件名不能更改,则应使用以下命令触发文件下载:
这意味着在上传过程中存储文件后,必须跟踪原始文件名。这可以通过简化文件名并将原始文件名存储在数据库中来实现,也可以通过存储文件名时对其名称进行编码以使其可以转换回原始名称来实现。
在数据库中跟踪原始文件名可以简化文件名,使其易于识别(例如'hallä där.txt' -〉'halla dar.txt')。
然而,使用数据库并不总是一个选择。有不同的方法可以将UTF-8或ISO-8859-1字符串转换为ASCII,并可以将其转换回来(例如base64_encode/base64_decode,mb_convert_encoding等),每种方法都有优缺点(例如,取决于您是否希望能够以可识别的名称存储文件)。
hgc7kmma3#
不能在文件名中使用/。如果文件名包含/,请先将其删除。