Загруженное изображение django заканчивается с неправильным именем файла - PullRequest
0 голосов
/ 18 января 2010

Я не знаю, является ли это ожидаемым поведением или нет, но если я создаю проект с одной моделью с полем ImageField и загружаю фотографию с именем «árvórés», загруженный файл сохраняется с непонятным именем (Ascii, я полагаю). Как прямой результат, это фото становится невозможно получить с сайта.

Это нормально? Если да, то как разрешить эти типы имен файлов?

1 Ответ

3 голосов
/ 19 января 2010

Проблема в том, что вы не указали, каким образом данные POST должны кодироваться браузером, и впоследствии вы получаете все, что браузер предположил, что он должен использовать - обычно ISO-8859-1 вместо Unicode (UTF-8 ).

Спецификация HTML 4.01 для элемента FORM включает в себя атрибут «accept-charset», который позволяет вам указать, для какой настройки кодировать данные POST:

accept-charset = список кодировок [CI]

Этот атрибут определяет список кодировки символов для входных данных что принято сервером обработка этой формы. Значение является список, разделенный пробелами и / или запятыми значения кодировки. Клиент должен интерпретировать этот список как эксклюзивный или список, то есть сервер может принять любую кодировку за каждое полученное лицо.

Значение по умолчанию для этого атрибута является зарезервированной строкой "НЕИЗВЕСТНО". пользователь агенты могут интерпретировать это значение как кодировка символов, которая использовалась для передать документ, содержащий это Элемент FORM.

Другими словами, если вы обслуживаете страницу, закодированную в UTF-8, браузер по умолчанию будет отправлять запросы в UTF-8.

Лучшее решение - указать кодировку символов для всех ваших страниц, включив соответствующую кодировку в заголовки вашего ответа или добавив что-то вроде следующего в ваш HTML в разделе HEAD:

<META http-equiv="Content-Type" content="text/html; charset=UTF-8">

В спецификации HTML 4.01 есть раздел о том, как указать, какую кодировку символов вы используете .

Альтернативное, но меньшее исправление - не указывать кодировку символов где-либо, а вместо этого декодировать имя файла вручную, предполагая, что браузер отправляет кодировку по умолчанию ISO-8859-1:

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            filename = form.cleaned_data.image.name.decode('iso-8859-1')
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...