laravel 4文件名回退必须只包含ASCII字符

时间:2013-11-20 11:09:25

标签: php apache symfony laravel-4

我的文件有UTF-8(希腊语)字符,我无法下载。我正在使用laravel 4.这是我的代码:

//下载

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

我收到以下错误(invalidArgumentException)消息:文件名回退必须只包含ASCII字符

有关如何解决该问题的任何想法......?

2 个答案:

答案 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_decodemb_convert_encoding等等,每个都有利有弊(例如,取决于您是否希望能够以可识别的名称存储文件)。