Nano Hash - криптовалюты, майнинг, программирование

Повреждение имени файла при загрузке файла (IE)

Я реализовал простой механизм загрузки-выгрузки файлов. Когда пользователь щелкает имя файла, файл загружается со следующими заголовками HTTP:

HTTP/1.1 200 OK
Date: Tue, 30 Sep 2008 14:00:39 GMT
Server: Microsoft-IIS/6.0
Content-Disposition: attachment; filename=filename.doc;
Content-Type: application/octet-stream
Content-Length: 10754

Я также поддерживаю японские имена файлов. Для этого я кодирую имя файла с помощью этого java-метода:

private String encodeFileName(String name) throws Exception{
    String agent = request.getHeader("USER-AGENT");
    if(agent != null && agent.indexOf("MSIE") != -1){ // is IE
        StringBuffer res = new StringBuffer();
        char[] chArr = name.toCharArray();
        for(int j = 0; j < chArr.length; j++){
            if(chArr[j] < 128){ // plain ASCII char
                if (chArr[j] == '.' && j != name.lastIndexOf("."))
                    res.append("%2E");
                else
                    res.append(chArr[j]);
            }
            else{ // non-ASCII char
                byte[] byteArr = name.substring(j, j + 1).getBytes("UTF8");
                for(int i = 0; i < byteArr.length; i++){
                    // byte must be converted to unsigned int
                    res.append("%").append(Integer.toHexString((byteArr[i]) & 0xFF));
                }
            }
        }
        return res.toString();
    }
    // Firefox/Mozilla
    return MimeUtility.encodeText(name, "UTF8", "B");
}

До сих пор это работало хорошо, пока кто-то не обнаружил, что это не работает с длинными именами файлов. Например: あああああああああああああああ2008.10.1あ.doc. Если я изменяю одну из однобайтовых точек на однобайтовое подчеркивание или удаляю первый символ, все работает нормально. т. е. это зависит от длины и URL-кодирования символа точки. Ниже приведены несколько примеров.

Это сломано (あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

Это нормально (あああああああああああああああ2008_10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008_10%2E1%e3%81%82.doc;

Это тоже нормально (あああああああああああああああ2008.10.1あ.doc):

Content-Disposition: attachment; filename=%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%82%e3%81%822008%2E10%2E1%e3%81%82.doc;

Кто-нибудь знает?


Ответы:


1

gmail обрабатывает экранирование имени файла несколько иначе: имя файла заключается в кавычки (двойные кавычки), а однобайтовые точки не экранируются URL-адресом. Таким образом, длинное имя файла в вопросе допустимо.

Content-Disposition: attachment; filename="%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%82%E3%81%822008.10.1%E3%81%82.doc"

Однако все еще существует ограничение (очевидно, только для IE) на длину имени файла в байтах (я полагаю, ошибка). Таким образом, даже если имя файла состоит только из однобайтовых символов, начало имени файла усекается. Ограничение составляет около 160 байт.

30.09.2008
  • Поздравляю! Иногда лучший ответ, который можно получить, — это отсутствие ответа вообще, это заставляет нас снова взглянуть на проблему — и гораздо полезнее, когда вы сами ее решаете;) 30.09.2008
  • См. также stackoverflow.com/q/93551/3995261 (бит *=UTF-8'') 04.02.2018

  • 2

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

    Мое решение состояло в том, чтобы полностью избежать заголовка Content-Disposition и добавить имя файла в конец URL-адреса, чтобы заставить браузер думать, что он получает файл напрямую. например

    http://www.xyz.com/cgi-bin/dynamic.php/あああああああああああああああ2008.10.1あ.doc
    

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

    21.12.2009
  • Уже не правда. В современных браузерах вам больше не нужен специальный регистр. 16.12.2012

  • 3

    Основная проблема здесь в том, что IE не поддерживает соответствующий RFC, здесь: RFC2231. См. указатели и тестовые примеры. Кроме того, обходной путь, который вы используете для IE (просто использование UTF-8 с процентным экранированием), имеет несколько дополнительных проблем; он может работать не во всех локалях (насколько я помню, этот метод не работает в Корее, если только IE не настроен на постоянное использование UTF-8 в URL-адресах, что не является значением по умолчанию), и, как упоминалось ранее, существуют ограничения по длине (я слышал, что то исправлено в IE8, но я еще не пробовал).

    01.05.2009
  • Тем временем IE поддерживает кодировку, определенную в RFC 6266 (начиная с IE9). 16.12.2012

  • 4

    Я думаю, что эта проблема исправлена ​​​​в IE8, я видел, как она работает в IE 8.

    16.08.2010
  • Это действительно должен быть комментарий к ответу, а не ответ, потому что он бесполезен для тех, кому нужна совместимость с браузерами IE до 8. 15.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..