2008年3月15日土曜日

JAVAのファイルアップロード、commons使わない版

http://www.wings.msn.to/index.php/-/A-03/978-4-7980-1669-6/


のサーブレットでのファイルアップロードが塩っぱすぎるので書き直し

大体あんな書き方してたら、パラメータと供に渡せないじゃんよ、マルチパートを理解してないのが丸分かりだわさ

それなりに頑張って網羅してるのはいいんだけど....

もしかしてJ2EEのほうに書いてあったのでマニュアル探せなかったみたいなオチか?



public class sample_binup extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(sample_binup.class);


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
  // doGet
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
  logger.info("sample_binup start");
  request.setCharacterEncoding("UTF-8");


  // このパラメタの取り方は使えない
  //String strUSERID = (request != null) ? request.getParameter("userid") : "";


      try {
   // ファイルのアップロード


   ServletInputStream is=request.getInputStream();
   ByteArrayOutputStream baos=new ByteArrayOutputStream();
   PrintStream ps=new PrintStream(baos,true);
   ps.print("Content-Type: " + request.getContentType());
   ps.println(System.getProperty("line.separator"));
   
   // リクエストデータをバイナリとして読み込み、JavaMailの機能を利用して本体部分を取得。
   int i;
   while((i=is.read())!=-1){baos.write(i);}
   Properties prop=System.getProperties();
   Session sess=Session.getDefaultInstance(prop);
   MimeMessage msg=new MimeMessage(sess,new ByteArrayInputStream(baos.toByteArray()));


   MimeMultipart mm = (MimeMultipart)msg.getContent();
   int mmcount = mm.getCount();


   for(int l=0;l<mmcount;l++)
   {
    BodyPart body = mm.getBodyPart(l);
   
    // 取得したバイナリデータからファイル名の部分を取り出す。
    // ヘッダ部分はContent-Disposition: ... filename="...upload.dat"のような形式になっている
    // 例えば以下
    //form-data; name="userid"
    //form-data; name="fl"; filename="C:\Documents and Settings\ito\デスクトップ\新規ビットマップ イメージ.bmp"
    String[] ary=body.getHeader("Content-Disposition");
      
    Hashtable ht = new Hashtable();
    for(int j=0;j<ary.length;j++)
    {
     String[] ary2 = ary[j].split(";");
     for(int k=0;k<ary2.length;k++)
     {
      String[] parms = ary2[k].split("=");
      ht.put(parms[0].trim(), parms.length==1?"":parms[1].trim());
     }
    }
       
    if(ht.containsKey("filename"))
    {
     // 取得したデータ本体部分を、取得したファイル名で/フォルダに格納し、アップロード結果を出力
     InputStream stream=body.getInputStream();
     File fl=new File("C:\\test.bin");//ht.get("filename").toString()
     FileOutputStream fos=new FileOutputStream(fl);
     while((i=stream.read())!=-1){fos.write(i);}
     fos.close();   
    }
    else
    {
     // ファイル名が無いものを通常のパラメータとして扱う
     //String n = ht.get("name").toString(); //これでパラメータの名前は取れる
     InputStream stream=body.getInputStream();
     ByteArrayOutputStream bao = new ByteArrayOutputStream();
     while((i=stream.read())!=-1){bao.write(i);}
     bao.close();
     String parmval = bao.toString("utf-8");
     logger.info(ht.get("name").toString() + ":" + parmval);
    }
   }
  } catch (Exception ex) {
   // ログ出力
   logger.fatal(ex);
  }
}
}



1 件のコメント:

  1. ちなみに、あともう少し書き直す予定(w

    返信削除