2016-05-16 4 views
1

Я пытаюсь установить заголовок Content прочтения, чтобы получить пользовательское имя файла во время выполнения загрузки файлов в IE 11.IE 11 не анализирует HTTP заголовка Content прочтения правильно

Я столкнулся с очень странным поведением в IE 11: когда escape (U + 001B) присутствует в имени файла заголовка Content Disposition. IE 11 не может установить правильное имя файла (в заголовке Content Dispostion Header). Например content_disposition с отформатированных file_name_1 запускает IE 11 ошибку, но форматирование с file_name_2 прекрасно:

# There are invisible control character escape (U+001B) 
name = u'_$B!' 
file_name_1 = quote(name) # gives "_%1B%24B%21" 
file_name_2 = "_%24B%21.pdf" 
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2 

Есть какие-то способы, чтобы обеспечить поддержку любого utf8 файла в IE11.

Примечание: Во всех остальных браузерах все, кажется, работает хорошо, и я надеюсь, что есть способ исправить IE 11 поведение не нарушая других браузеров ...

+0

Я не понимаю - почему во-первых, нужен ли * невидимый символ * в имени файла? Это может быть какой-то фильтр безопасности. –

+0

@Pekka 웃 место не имеет значения там% 1B может быть где угодно в имени файла, проблема в том, что если% 1b present - имя файла будет неправильно отображаться. Кроме того, я не могу управлять данными, которые я бы назвал именем файла. –

+0

Какое имя файла вы используете вместо IE11? –

ответ

1

Рекомендуется предварительно удалить контрольные символы перед формированием заголовка содержимого содержимого (дополнительная информация в ответе @JulianReschke).

Control codes в питон может быть легко раздели с list comprehension и ord:

# There are invisible control character escape (U+001B) 
name = u'_$B!' 
# All chars with ord(s) <= 31 is a control characters. 
name = "".join(i for i in name if ord(i) > 31) 

Таким образом, после добавления строки выше кода, все начало работать нормально:

name = u'_$B!' 
# Strip control codes 
name = "".join(i for i in name if ord(i) > 31) 

file_name_1 = quote(name) # gives "_%1B%24B%21" 
file_name_2 = "_%24B%21.pdf" 
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2 
2

не принимает символы, как это на самом деле то, что спецификация рекомендует , См. https://greenbytes.de/tech/webdav/rfc6266.html#rfc.section.4.3.p.5:

«Получатели ДОЛЖНЫ разбивать или заменять последовательности символов, которые, как известно, вызывают путаницу как в пользовательских интерфейсах, так и в именах файлов, таких как управляющие символы и ведущие и конечные пробелы».

Конечно, можно утверждать, что сохранение остальных символов будет чем-то лучше, но важным моментом является то, что пользовательским агентам рекомендуется снимать управляющие символы.

+0

Вы правы, скорее всего, я удалю контрольные символы, если я не получу никакой другой опции –

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