powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / download файла с русским именем через сервлет
16 сообщений из 16, страница 1 из 1
download файла с русским именем через сервлет
    #33649861
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бьется имя файла, становится нечитабельным:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
String contentType;
..
response.setContentType(contentType + ";charset=UTF-8");

String fileName;
..
response.setHeader(
  "Content-Disposition", "attachment;filename=\"" + fileName.replace('\"', '\'') + "\""
); 
Добавление в setContentType() не помогло, есть какие-либо варианты?
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33649906
Насчет кодировок в Content-Disposition никакого стандартна нет (т.е. нужно использовать US-ASCII). Читал всякие RFC и пробовал разные варианты. Самое лучшее, чего мне удалось добиться, это чтобы клиент запрашивал во УРЛу:
Код: plaintext
http://srv/path/ИмяФайла.xls
Но с этим тоже возникают проблемы с некоторыми клиентами и при наличии экстравагантных символов ( например, пробелов ) в имени файла.

В итоге, самый лучший способ - транслитерация - и никаких проблем.
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33649941
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второй мой дурацкий совет на сегодня - если к имени файла применить
что-то типа encodeURL()? чтобы имя было типа %65%73%7F.gif ...
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650049
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот java.net.URLEncoder.encode() не помог.
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650085
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovВот java.net.URLEncoder.encode() не помог.
ага. я так и знал. ведь урл енкодит браузер...
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650107
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ненавижу регистрацию wrote:
> В итоге, самый лучший способ - транслитерация - и никаких проблем.

Предполагается мультиязыковое приложение, имхо в общем случае транслитерацию не
сделать (для иероглифов, например).
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650260
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)

Note that the filename is surrounded by double quotes, per RFC 2231 . This allows
for the use of extended characters within the filename (i.e., international characters,
though at present Internet Explorer does not support this internationalization).
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650288
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мозиллу и Оперу я почти поборол:
Код: plaintext
1.
2.
3.
response.setHeader(
  "Content-Disposition", "attachment; filename*=UTF-8''" + 
  MimeUtility.encodeText(fileName, "UTF8", "Q")
);
Не совсем, но что-то вроде этого. Остался IE.
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #33650309
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, почти облажался, но вроде все получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
String userAgent = request.getHeader("USER-AGENT").toLowerCase();
fileName = URLEncoder.encode(fileName, "UTF8");
 if  (userAgent !=  null  
  && userAgent.indexOf("opera") == - 1  
  && userAgent.indexOf("msie") != - 1  ) {
  response.setHeader(
    "Content-Disposition", 
    "attachment; filename=\"" + fileName + "\"" 
  );
}  else  {
  response.setHeader(
    "Content-Disposition", 
    "attachment; filename*=\"utf-8'" + fileName + "\""
  );
}
т.е. все-таки URLEncoder.encode(), а я-то на Мозилле тестировал.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
download файла с русским именем через сервлет
    #39273870
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть решение в одну строчку

Код: java
1.
MimeUtility.encodeWord(fileName, "utf-8", "Q")



Только смущает, что приходится в Java 8 для этого подрубать либу. При этом она 2013 года.

Код: xml
1.
2.
3.
4.
5.
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>



Может я что-то упустил в Java 8?
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39273888
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01Есть решение в одну строчку
за 10 то лет наверно и данной строчки не надо)).
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39273910
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Паша01,
это решение работает везде, кроме эксплорера, сафари, хрома и оперы
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39273964
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
недавно с этим .encodeWord(fileName, "utf-8", "Q") и .encodeText(fileName, "utf-8", "Q")
возился. К примеру:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.mail.internet.MimeUtility;
import org.apache.http.client.utils.URLEncodedUtils;

public class EncodingTests {
    
    static String fileName = "Заявка №13 выгр. 13.07.2016 (12-25).xls";
    
    public static void main(String[] args) throws UnsupportedEncodingException {
        System.out.println(URLEncoder.encode(fileName, "UTF-8"));
        System.out.println(MimeUtility.encodeWord(fileName, "UTF-8", "Q"));
        System.out.println(fileName);
        
    }
}


выдает вот что:

%D0%97%D0%B0%D1%8F%D0%B2%D0%BA%D0%B0+%E2%84%9613+%D0%B2%D1%8B%D0%B3%D1%80.+13.07.2016+%2812-25%29.xls
=?UTF-8?Q?=D0=97=D0=B0=D1=8F=D0=B2=D0=BA=D0=B0_=E2=84=961?= =?UTF-8?Q?3_=D0=B2=D1=8B=D0=B3=D1=80=2E_13?= =?UTF-8?Q?=2E07=2E2016_=2812-25=29=2Exls?=
Заявка №13 выгр. 13.07.2016 (12-25).xls

Ну а когда выгружаю файл браузером, не суть чем, через Vaadin, то первые два варианта такое имя файлу и дают, а третий, то есть без всего, ставит вместо пробелов плюсики.
Мне пока некогда с этим возиться, клиенту сказал, что будут пока нижние подчеркивания в имени файлов, а потом как будет время поправим. Пока хз как делать :)
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39273968
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну URLEncoder и декодер я знаю, просто так его тут впихал, посмотреть еще раз :)
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39273976
Фотография Паша01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня юзается спринг, и все работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @RequestMapping(value = "/export/excel/{id}", method = RequestMethod.GET)
    @ResponseBody
    public FileSystemResource exportPersonToExcel(
            @PathVariable Long id, Locale locale,
            HttpServletResponse response,
            HttpServletRequest request) throws IOException {
        File personExcel = excelService.exportPersonToExcel(personService.get(id), locale, request.getServletContext());
        
        response.setContentType("application/vnd.sealed-xls");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + MimeUtility.encodeWord(personExcel.getName(), "utf-8", "Q") + "\"");
       
        return new FileSystemResource(personExcel);
    }
...
Рейтинг: 0 / 0
download файла с русским именем через сервлет
    #39274091
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паша01У меня юзается спринг, и все работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    @RequestMapping(value = "/export/excel/{id}", method = RequestMethod.GET)
    @ResponseBody
    public FileSystemResource exportPersonToExcel(
            @PathVariable Long id, Locale locale,
            HttpServletResponse response,
            HttpServletRequest request) throws IOException {
        File personExcel = excelService.exportPersonToExcel(personService.get(id), locale, request.getServletContext());
        
        response.setContentType("application/vnd.sealed-xls");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + MimeUtility.encodeWord(personExcel.getName(), "utf-8", "Q") + "\"");
       
        return new FileSystemResource(personExcel);
    }



+ 1

в спринг


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[]{characterEncodingFilter};
    }
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / download файла с русским именем через сервлет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]