質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

サーブレットでのファイルアップロードについて

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 2,631

Ritz_Malheur

score 12

質問させていただきます。

サーブレットの勉強をしており、
ファイルアップロードの項目でつまってしまいました。

問題①
『'開始中 ローカル・ホストのTomcat8(Java8)'に問題が発生しました。
サーバー ローカル・ホストのTomcat8(Java8)は始動に失敗しました。』
と出てしまい、動かなくなってしまいました。

直前の作業としては、
Eclipseでソースを書いている時に、『Ctrl + Shift + O』を押して
import文を整えたところ、
教科書とは違う、
『 import org.apache.tomcat.util.http.fileupload.FileItem; 』
という文がimportされてしまって、コンパイルエラーになっており、
その文を
『 import org.apache.commons.fileupload.servlet.ServletFileUpload; 』
に書き換えました。

問題②
『mvn clean』や『clean compile』をすると実行できるようなりますが、
今まで問題なく動作していたサーブレットが実行できなくなってしまいました。


いずれも、htmlの画面までは表示されますが、
そこから遷移せず、404エラーが出てしまいます。


どなたかわかる方がいらっしゃいましたら、教えていただけませんでしょうか?
宜しくお願いいたします。

<実行環境>
・Eclipse 4.4
・Maven
・Tomcat8
・commons-fileupload-1.3.1.jar
・commons-io-2.4.jar


package servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class FileUploadServlet
 */
@WebServlet("/fileupload")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileUploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        // リクエスト処理
        String message = "テキストファイルをアップロードできませんでした。";
        if (ServletFileUpload.isMultipartContent(request)) {
            String dataDir = getServletContext().getRealPath("/") + "data";
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload uploader = new ServletFileUpload(factory);
            uploader.setFileSizeMax(1024 * 1024); // 1MB
            try {
                List<FileItem> fList = uploader.parseRequest(request);
                for (FileItem fItem : fList) {
                    if (!fItem.isFormField()) {
                        File tmpFile = new File(fItem.getName());
                        String fileName = tmpFile.getName();
                        if (fileNameCheck(fileName)) {
                            File file = new File(dataDir + File.separator
                                    + fileName);
                            fItem.write(file);
                            message = "テキストファイル「" + fileName + "」をアップロードしました。";
                        } else {
                            message = "テキストファイルを正しく指定してください。";
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            message = "form タグの enctype 属性に multipart/form-data を指定してください。";
        }
        // レスポンス処理
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
        out.println("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
        out.println("<head>");
        out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />");
        out.println("<title>ファイルアップロード</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>" + message + "</p>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    private boolean fileNameCheck(String fileName) {
        String regex = "^\\S+\\.txt$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(fileName);
        return matcher.matches();
    }
}




<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>ファイルアップロード</title>
</head>
<body>
    <h1>アップロードするテキストファイルを指定してください</h1>
    <form action="fileupload" method="post" enctype="multipart/form-data">
        <p>
            <input type="file" name="txtfile" value="" />
        </p>
        <p>
            <input type="submit" value="送信" />
        </p>
    </form>
</body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • eripong

    2015/08/05 19:29

    起動時に他のエラーメッセージや、例外スタックトレースは出ていませんか?あれば追記してもらえませんか?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2015/08/10 14:06

    始動しなかった、ということなので、私も起動時にエラーメッセージが出ていると思います。下記の情報を追記されると回答が集まるでしょう。

    1. Tomcatの起動はどのように行っていますか?
    2. Tomcatを`TOMCAT_HOME/bin/startup.bat`等で起動しているのであれば、`TOMCAT_HOME/logs/`配下にログが出力されているはずです。その中の`catalina.out`等に例外スタックトレースは出ていませんか?
    3. Eclipseから起動している場合は、コンソールビューにエラーメッセージや例外スタックトレースは出ていませんか?
    4. Mavenから起動している場合は、Mavenを起動しているターミナルやコマンドプロンプトにエラーメッセージや例外スタックトレースは出ていませんか?

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る