アップロードしたファイルの文字コード変換方法(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 にアクセス。