解决 Laravel 无法下载中文名称的文件问题

本文介绍如何在 Laravel 中不用修改源码解决下载中文文件名称的文件问题。

近日在使用 Laravel 添加下载功能时,遇到了无法下载中文名称的文件的问题。

Laravel 会给出报错信息:The filename fallback must only contain ASCII characters

意思文件名称必须只能包含 ASCII 字符,二话不说复制这段信息扔给 Google,看了几个搜索出来的结果,大致的意思都是需要修改源码,但我不想修改源码,于是继续寻找答案,最终发现了我想要的。

使用以下命令创建一个服务器提供者(ServiceProvider):

php artisan make:provider ResponseMacroServiceProvider

编辑其内容为以下(app/Providers/ResponseMacroServiceProvider.php):

<?php

namespace App\Providers;

use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('downloadEx', function ($file, $name = null, array $headers = [], $disposition = 'attachment') {
            $response = new BinaryFileResponse($file, 200, $headers, true);

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

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

config/app.phpproviders 数组中添加这个服务器提供者:

return [
    // ...
    'providers' => [
        // ...
        App\Providers\ResponseMacroServiceProvider::class,
    ];
    // ...
];

在需要的地方使用 response()->downloadEx($filename)

参考:https://qiita.com/zeriyoshi/items/8b031b9c4a5a068fe0e4


 上一篇
PHP 使用 OPENSSL 分段加密与解密 PHP 使用 OPENSSL 分段加密与解密
最近在做一个接口对接的任务时,遇到 RSA 加密与解密的问题,对方的语言是 Java,约定数据需要经 RSA 加密后传输,解密后使用。 生成密钥生成私钥 openssl genrsa -out app_private_key.pem 204
2019-06-04
下一篇 
The Fucking Github The Fucking Github
The Fucking Github 是一个 Chrome 浏览器的扩展插件,可以用来很方便地查看、整理、搜索你已经 Star 过的项目和搜索 Github 上的项目。 能干啥你是否在 Github 上有很多 star 过的项目并且经常需
2019-04-14
  目录