symfony laravel 4回退文件名只能包含ASCII字符

qnakjoqk  于 2023-01-21  发布在  其他
关注(0)|答案(3)|浏览(129)

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

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

我收到以下错误(invalidArgumentException)消息:文件名回退只能包含ASCII字符
有什么办法解决这个问题吗?

cbjzeqam

cbjzeqam1#

是Response::download函数中的bug,修改为:

// 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

拉腊维尔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(),等等)和你的自定义方法:* 响应::下载()*,_响应()-〉下载

y1aodyip

y1aodyip2#

正如www.example.com中所述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' -〉'halla dar.txt')。
然而,使用数据库并不总是一个选择。有不同的方法可以将UTF-8或ISO-8859-1字符串转换为ASCII,并可以将其转换回来(例如base64_encode/base64_decodemb_convert_encoding等),每种方法都有优缺点(例如,取决于您是否希望能够以可识别的名称存储文件)。

hgc7kmma

hgc7kmma3#

不能在文件名中使用/。如果文件名包含/,请先将其删除。

$file_name = str_replace(array("/", "\\", ":", "*", "?", "«", "<", ">", "|"), "-", $data->title);
$tempVideo = tempnam(sys_get_temp_dir(), $file_name);
copy($data->file, $tempVideo);            
return response()->download($tempVideo, $file_name);

相关问题