Как получить только имя файла с загрузкой файла Jersey
Я делаю загрузку файла с Джерси, но мне нужно только имя файла. Internet Explorer отправляет весь путь, и на основе того, что находится в FormDataContentDisposition, Джерси анализирует косые черты, поэтому я даже не могу разобрать это. Спасибо.
4 ответов
звучит как сложная проблема. Идеальный случай, конечно, - захватить строку, содержащую косые черты, и просто использовать строку.раскол!
в противном случае единственная стратегия, о которой я могу начать думать, - это попытаться перебрать строку, чтобы увидеть, существуют ли папки для разных длин первой части строки и т. д. Это также может вызвать проблемы, если вы собираетесь найти папку " MyFolder (2)", а также "MyFolder". Я не знаю много о Джерси, но я рекомендую пытаюсь найти другой способ, чтобы захватить строку вам нужно.
- добавить событие изменения в тег ввода файла
- разобрать имя как его еще слеши в этот момент
- вставьте это значение в скрытый вход
этот скрытый ввод затем отправляется вместе с остальной частью формы.
@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, скомпилируйте и выпуск с измененным номером версии.