アップロードしたファイルの文字コード変換方法(SJISからUTF8)
WebアプリケーションでShift-JISのファイルをアップロードして内部でUTF-8に変換して出力するサンプルを作ってみた。
あくまで参考程度でお願いいたします。
簡単に動作確認まで実施してます。
必要なライブラリ
commons-fileupload-1.3-bin.zip
commons-io-2.4-bin.zip
動的コンテンツで作成。
UploadFileServlet.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadFileServlet extends HttpServlet {
private String outPutPath = "C:/tmp/output.txt";
private String redirectPage = "upload.html";
private String inEncoding = "MS932";
private String outEncoding = "UTF-8";
/**
* 文字コード変換して書き込む例
*/
public void doPost(HttpServletRequest req,
HttpServletResponse res) throws IOException {
// Shift_JISのファイルから文字コード変換して書き込む例
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
factory.setSizeThreshold(1024);
upload.setSizeMax(-1);
upload.setHeaderEncoding(inEncoding);
InputStreamReader in = null;
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(outPutPath), outEncoding);
try {
List<FileItem> list = upload.parseRequest(req);
Iterator<FileItem> iterator = list.iterator();
while (iterator.hasNext()) {
FileItem fItem = iterator.next();
if (!(fItem.isFormField())) {
String fileName = fItem.getName();
if ((fileName != null) && (!fileName.equals(""))) {
in = new InputStreamReader(fItem.getInputStream(), inEncoding);
int cbuf;
while ((cbuf = in.read()) > -1) {
System.out.println(cbuf);
out.write(cbuf);
}
out.flush();
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
// ignore
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
// ignore
}
}
}
res.sendRedirect(redirectPage);
}
}
upload.html
<html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <body> <form method="POST" enctype="multipart/form-data" action="upload"> ファイルアップロード1: <input type="file" name="upfile1"><br/> ファイルアップロード2: <input type="file" name="upfile2"><br/> <input type="submit" value="アップロード"> アップロードのテスト </form> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebTest" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>WebTest</display-name> <servlet> <servlet-name>upload</servlet-name> <servlet-class>UploadFileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>upload</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> </web-app>
WEB-INFのlibの配下に
commons-fileupload-1.3-bin.zip
commons-io-2.4-bin.zip
配置して。
後のめんどい設定周りは適当にして。
デプロイして、サーバー起動して
http://localhost:8080/WebTest/upload.html にアクセス。

コメントを残す