2014-11-21 5 views
0

У меня возникла проблема, когда я вызываю request.getParameter("filename") в HttpServletRequest в GWT. Вот код, как я кодировать URL:request.getParameter() не удалось правильно закодировать URL

String sFile = URL.encodeQueryString("°^!§$%()=`´' glassfish +~#'@€-_²³.pdf"); 
String sURL = GWT.getModuleBaseURL() + "filehttpservice" // name of the httpservlet 
    + "?filename=" + sFile; // the name of the file to download 
Window.open(sURL, "_blank", sFeatures); // sFeatures are some window-settings 

Так я хочу, чтобы загрузить файл с некоторыми специальными символами в имени. Имя URL-закодирован является:

%C2%B0%5E!%C2%A7%24%25()%3D%60%C2%B4'%20glassfish%20%2B~%23'%40%E2%82%AC-_%C2%B2%C2%B3.pdf 

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

Так что, когда приходит запрос GET-метод из HttpServlet я хочу, чтобы извлечь имя файла из его параметров с помощью следующего кода:

request.setCharacterEncoding("UTF-8"); 
String sFilename = request.getParameter("filename"); 

Но принимаемой Имя файла:

°^!§$%()=`´' glassfish +~#'@â¬-_²³.pdf 

, что совершенно неправильно.

Я долго искал и пробовал серверные решения, но ничего не меняет. Кто-нибудь знает, как я могу получить правильное имя файла?

ответ

0

request.setCharacterEncoding("UTF-8"); не влияет на doGet(). В doGet() запросString анализируется контейнером до достижения значения doGet().

Вы должны использовать doPost и request.getInputStream() и разобрать queryString. И не используйте request.getParameter() до request.getInputStream(), иначе это не сработает.

Редактировать Java по умолчанию кодирует в utf-16String .. Так что вам придется конвертировать его в utf-8.

response.setHeader("Content-Disposition", new String("attachment; filename=\"" + sUrlFilename + ".pdf" + "\"".getBytes("utf-8"),"ISO-8859-1"));

+0

Хорошо, но если я использую 'doPost', декодирование в любом случае потерпит неудачу. Я получаю точно такое же неправильное имя файла. Похоже, что это не имеет никакого отношения к CharacterEncoding – N43

+0

@ N43 'URLDecoder .decode (новый String (request.getParameter (" filename "). GetBytes ( " iso-8859-1 ")), CHARSET_FOR_URL_ENCODING); подробнее здесь http://stackoverflow.com/questions/469874/how-do-i-correctly-decode-unicode-parameters-passed-to-a-servlet –

+0

Спасибо! Теперь я правильно декодирую параметры самостоятельно, но сталкиваюсь с другой проблемой с ответом: когда я устанавливаю ответ-Header 'response.setHeader (« Content-Disposition »,« attachment; filename = \ »« + sUrlFilename + ».pdf« + », \ ""); 'где sUrlFilename является правильным UTF-8-Filename:' ​​° ^! § $%() = '' glassfish + ~ # '@ € -_²³', а ContentType - 'application/pdf; charset = UTF-8' Имя файла в подсказке для загрузки показывает '^! $%() = 'glassfish + ~ #' @ -_ .pdf', что также неверно. У вас есть идея, как это исправить? (Oh и 'response.setCharacterEncoding (" UTF-8 ")' также был вызван) – N43

0

Как сказал Анураг Ананд, это вопрос кодирования; вам необходимо настроить контейнер сервлета для декодирования URL-адресов как UTF-8.

С Tomcat, например, это настроено на уровне Connector с помощью атрибута URIEncoding. С Jetty это можно установить с помощью системного свойства org.eclipse.jetty.util.UrlEncoding.charset.