標準のファイルアップロードにApacheCommonsFileuploadツールを使用しています。私の問題は、アップロードされたファイルに特殊文字(á、é、úなど)が含まれていると、それらのファイル名を正しく取得できないことです。これらはすべて?に変換されます。サイン。
request.getCharacterEncoding()はUTF-8と言いますが、文字列fileItem.getName()で取得するバイトは、すべての特殊文字ですべて同じです。
何が悪いのか手伝ってくれませんか。
(詳細:WindowsでFirefox 3.6.12、Weblogic 10.3を使用)
これは私のコードスニペットです:
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..
私も同じ問題を抱えていて、このように解決しました。
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 で提供されている例に基づいてコードを作成した場合は、上記の2か所でUTF-8を設定する必要があります。
ServletFileUploadインスタンスの.setHeaderEncoding( "ISO-8858-2")を明示的に呼び出すことにより、問題を解決しました。
これらの特別な文字の場合、uはエンコーディングを「iso8859-1」に設定できます。 UTF-8が機能していないようです。
エンコーディングタイプを設定していない場合..LinuxマシンはUTF-8であるデフォルトのエンコーディングを採用し、Windowsは互換性のあるエンコーディングを採用します