Загрузка файла файла сервлета
Я использую средства Apup Commons Fileupload для стандартной загрузки файлов. Моя проблема в том, что я не могу получить правильное имя загруженных файлов, если они содержат специальные символы (á, é, ú и т.д.). Все они преобразуются? знаки.
request.getCharacterEncoding() говорит UTF-8, но байты, которые я получаю в строке fileItem.getName(), одинаковы для всех моих специальных символов.
Можете ли вы мне помочь, что не так?
(Некоторые сведения: использование Firefox 3.6.12, Weblogic 10.3 в Windows)
Это мой фрагмент кода:
public CommandMsg(HttpServletRequest request) {
Enumeration names = null;
if (isMultipart(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List uploadedItems = upload.parseRequest(request);
Iterator i = uploadedItems.iterator();
FileItem fileItem = null;
while (i.hasNext()) {
fileItem = (FileItem) i.next();
if (fileItem.isFormField()) {
// System.out.println("isFormField");
setAttribute(fileItem.getFieldName(), fileItem.getString());
} else {
String enc = "utf-8";
enc = request.getCharacterEncoding();
String fileName = fileItem.getName();
byte[] fnb = fileItem.getName().getBytes();
byte[] fnb2 = null;
try {
fnb2 = fileItem.getName().getBytes(enc);
String t1 = new String(fnb);
String t2 = new String(fnb2);
String t3 = new String(fnb, enc);
String t4 = new String(fnb2, enc);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
setAttribute(fileItem.getFieldName(), fileItem);
}
}
} catch (FileUploadException ex) {
ex.printStackTrace();
}
// etc..
Ответы
Ответ 1
У меня была такая же проблема, и я решил это так.
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
String value = Streams.asString(stream, "UTF-8");
}
}
Если вы основывали свой код на примере, представленном в http://commons.apache.org/fileupload/streaming.html, вам нужно убедиться, что вы устанавливаете UTF-8 в двух местах выше,
Ответ 2
Вам необходимо убедиться, что целевая консоль/файл/база данных/независимо от того, где вы печатаете/пишете/вставляете имя файла, также поддерживает UTF-8. Вопросительные знаки указывают на то, что он не настроен на прием UTF-8 и что сам объект знает об этом. В противном случае вы бы просто увидели mojibake.
Поскольку в вопросе отсутствует информация о цели, я не могу сделать больше, чем предлагать вам пройти через эту статью понять, что происходит с персонажами за кулисами.
Ответ 3
Решила проблему, явно вызвав экземпляр ServletFileUpload.setHeaderEncoding( "ISO-8858-2" ).
Ответ 4
Для этих специальных charecters u может установить кодировку на "iso 8859-1". UTF-8, похоже, не работает.
Если u r не задает какой-либо тип кодирования.. Тогда linux-машина примет кодировку по умолчанию, которая является UTF-8, и окна будут использовать совместимую кодировку