2013-11-20 4 views
3

В моем файле есть символы UTF-8 (greek), и я не могу его загрузить. Я использую Laravel 4. Вот мой код:laravel 4 Возврат файла должен содержать только символы ASCII

// скачать

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

Я получаю следующее сообщение об ошибке (InvalidArgumentException) сообщение: имя файла резервной должно содержать только символы ASCII

Любые идеи как исправить эту проблему ..?

+2

Я бы пошел с переименованием файлов ... Наличие таких вещей может быть головной болью на разных уровнях. –

+1

Тот же вопрос на форумах Laravel, ни одного реального решения, кроме переименования файлов. http://forums.laravel.io/viewtopic.php?pid=61493 –

ответ

8

Это ошибка в функции 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, вы можете расширить \ Осветите \ Routing \ ResponseFactory класс и переопределить скачать() метод , Затем, в 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(), откоса() - > вид() и т.д.) и пользовательские методы таким же образом: Response :: скачать(), _response() -> скачать

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» -> «halla dar.txt»).

Однако использование базы данных не всегда является опцией.Существуют различные способы преобразования строк UTF-8 или ISO-8859-1 в ASCII таким образом, что они могут быть преобразованы обратно (например, base64_encode/base64_decode, и др.), Каждый из которых имеет плюсы и минусы (например, в зависимости от того, вы хотите сохранить файл с узнаваемым именем).

+0

это решение не работает, даже передав имя utf-8 в качестве второго параметра методу 'downlaod', имя возвращаемого файла будет изменено на что-то еще – alex

Смежные вопросы