竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
ファイルのアップロードの方法についてお尋ねします
by スワジランド[swajiland]
竹形様

先日は、正規表現についてご丁寧に回答いただきましてありがとうございました。本日は、掲示板でtextだけではなく、ファイルを添付してMySQLへ登録しようと考えているのですが、その前段階でファイルのアップロードがなかなかうまくいきません。どうかご指導をおねがいします。
まず、ファイルを選択しておくるupload.jspは以下のとうりです、
<%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>FileUpload</title>
<meta http-equiv="Content-Type"
      content="text/html; charset=Windows-31J">
</head>

<body>
<!-- (1)<FORM>タグにmultipart/form-dataを指定 -->
<form method="POST"
      enctype="multipart/form-data"
      action="UploadFile">
  <!-- (2)ファイルを選択する<input type="file">タグを指定 -->
  <input type="file" name="filefd" />
  <input type="submit" value="送信" />
</form>
</body>
</html>
ファイルを受け取って保存するサーブレットUploadFile.javaは以下のとおりです。


import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.servlet.*;


/**
* Servlet implementation class UploadFile
*/
public class UploadFile extends HttpServlet {
    private static final long serialVersionUID = 1L;
     
    /**
    * @see HttpServlet#HttpServlet()
    */
    public UploadFile() {
        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
       
    }

    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
       
       
        //(1)アップロードファイルを格納するPATHを取得
        String path = getServletContext().getRealPath("UPLOADFILE.DATA");
        System.out.println(path);
        //(2)ServletFileUploadオブジェクトを生成
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setRepository(new File("C:\\FILEUPLOADTEMP"));
        ServletFileUpload upload = new ServletFileUpload(factory);
       
        //(3)アップロードする際の基準値を設定
        factory.setSizeThreshold(1024);
        upload.setSizeMax(1000 * 1024);
        upload.setFileSizeMax(1000 * 1024);
        upload.setHeaderEncoding("Windows-31J");

        try {
          //(4)ファイルデータ(FileItemオブジェクト)を取得し、
          //  Listオブジェクトとして返す
          List list = upload.parseRequest(request);

          //(5)ファイルデータ(FileItemオブジェクト)を順に処理
          Iterator iterator = list.iterator();
          while(iterator.hasNext()){
            FileItem fItem = (FileItem)iterator.next();
         
            //(6)ファイルデータの場合、if内を実行
            if(!(fItem.isFormField())){
              //(7)ファイルデータのファイル名(PATH名含む)を取得
              String fileName = fItem.getName();
              System.out.println(fileName);
              if⇒fileName != null) && (!fileName.equals(""){
                //(8)PATH名を除くファイル名のみを取得
//                fileName=(new File(fileName)).getName();
                //(9)ファイルデータを指定されたファイルに書き出し
                fItem.write(new File(path + "\\" + fileName));
//                fItem.write(new File(path,fileName));

              }
            }
          }
        }catch (FileUploadException e) {
          e.printStackTrace();
        }catch (Exception e) {
          e.printStackTrace();
        }
        //(10)uploadfile.jspページに戻る
        response.sendRedirect("uploadfile.jsp");
      }
   

}



このとき、一時的にアップロードしたファイルをためておくディレクトリ\FILEUPLOADTEMPにアップロードしたファイルのファイル名ではなく、upload_bd31924_11f8d251b33_8000_00000022.tmpのような連番のファイル(おそらくこのファイルがアップロードしたファイルだろうと思われる)が溜まるだけで、ファイル名が正しく反映されません。コンソールにpath名やファイル名を表示させようとしますが、反応しません。
どうかご教示ください。よろしくお願いします。
投稿:スワジランド[swajiland]/2009年 02月 20日 17時 13分 /更新:2009年 02月 20日 17時 14分
RE:ファイルのアップロードの方法についてお尋ねします
by 竹形 誠司[takegata]
竹形です。こんにちは。

一度ファイルとして保存してしまったものを、その後でMySQLに登録するのは結構難しいと思います。このサイトにFileUploadを使って、そのままMySQLに書き込む方法を書いてありますので、こちらを試してみていただけますか?

http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=267

投稿:竹形 誠司[takegata]/2009年 02月 20日 17時 37分 /更新:2009年 02月 20日 17時 38分
RE:ファイルのアップロードの方法についてお尋ねします
by スワジランド[swajiland]
竹形様
いつもご親切にありがとうございます。
3日間ほど悪戦苦闘していたのがウソのようにご指導頂いたBlobUploadProcess.jspで解決してしまいました。なんと感謝申し上げればよいのか表現のしようもありません。おまけにMySQLまで登録できてしまい、驚いています。本当にあつかましくて申しわけありませんが、このBlobUploadProcess.jspのなかで示されている
<P><a HREF="BlobList.jsp">一覧</a></P>
とある、BlobList.jspもよろしければいただけないでしょうか。
よろしくお願いいたします。
投稿:スワジランド[swajiland]/2009年 02月 20日 20時 53分 /更新:2009年 02月 20日 20時 54分
RE:ファイルのアップロードの方法についてお尋ねします
by 竹形 誠司[takegata]
以下に掲載しました。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=538#A538

拙著の読者様であれば、これぐらいはご自分でお書きになれるはずなんですけどね(笑)
投稿:竹形 誠司[takegata]/2009年 02月 20日 21時 38分 /更新:2009年 02月 20日 21時 38分