Как получить только имя файла с загрузкой файла Jersey

Я делаю загрузку файла с Джерси, но мне нужно только имя файла. Internet Explorer отправляет весь путь, и на основе того, что находится в FormDataContentDisposition, Джерси анализирует косые черты, поэтому я даже не могу разобрать это. Спасибо.

4 ответов


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

в противном случае единственная стратегия, о которой я могу начать думать, - это попытаться перебрать строку, чтобы увидеть, существуют ли папки для разных длин первой части строки и т. д. Это также может вызвать проблемы, если вы собираетесь найти папку " MyFolder (2)", а также "MyFolder". Я не знаю много о Джерси, но я рекомендую пытаюсь найти другой способ, чтобы захватить строку вам нужно.


  1. добавить событие изменения в тег ввода файла
  2. разобрать имя как его еще слеши в этот момент
  3. вставьте это значение в скрытый вход

этот скрытый ввод затем отправляется вместе с остальной частью формы.


@kombat нашел это решение и опубликовал его в качестве комментария. Для лучшего это теперь перепечатывается как ответ сообщества wiki.


Я получал эту ошибку, когда пытался браузер Eclipse. Когда я попробовал свой код на Chrome, FormDataContentDisposition.getFileName () был в порядке.


Это ошибка в Джерси. В nabble обсуждение http://jersey.576304.n2.nabble.com/Jersey-truncating-the-slashes-from-the-uploaded-file-name-td5984041.html автор ошибки раскрывается и признает "повторное использование кода" для разбора HTTP-заголовков для разбора Content-Disposition. Однако в процитированном RFC 2616 не указывается, что Content-Disposition поля должны быть экранированы в соответствии с правилами, указанными в заголовках HTTP. Как раз наоборот, там написано, что:

Content-Disposition не является частью стандарта HTTP, но поскольку он широко внедряется, мы документируем его использование и риски для реализаторы.

эта ошибка уже имеет уродливый обходной путь в классе org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide в фактической версии Джерси, однако он не работает с IE 11 и Edge, потому что он проверяет часть User-Agent, которая изменилась. Есть запрос pull с fix:https://github.com/jersey/jersey/pull/233/files, но для почти 2 многие годы никто не стремился к слиянию.

у вас есть 3 решения:

1) Aplly "исправление" на стороне клиента, что является IMHO неправильным подходом, потому что на стороне клиента нет ошибки, Ошибка в Джерси!

2) Измените Джерси на другой фреймворк, в котором разработчики более серьезно относятся к проблемам совместимости, вместо того, чтобы концентрироваться на максимальном повторном использовании кода и т. д.

3) патч Джерси вручную. Загрузите источники, примените запрос pull, скомпилируйте и выпуск с измененным номером версии.