arison.jp arison.jp blog - 現在をたのしく、未来をたのしむ。日常の思い出兼備忘録。

アップロードしたファ​イルの文字コード変換​方法(SJISからUTF8)

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

About arison

大都会岡山の南部にある玉野市生まれ。 大都会岡山のIT会社(目標は大都会No.1)でコンピュータとお客を相手に日夜格闘中。 関東出張中はグルメブログ。 基本的に遊び人のおっさん。 ライフハックとガンダム好き。ギガフロート玉野を浸透中。

25. 10月 2013 by arison
Categories: プログラミング | Tags: , | Leave a comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください