Servlet 3.0的檔案上傳寫法

Servlet 3.0已經大幅簡化網頁檔案上傳的程式寫法,以下是撰寫的幾個重點。

HTML寫法

  • <form>的enctype要是"multipart/form-data"
  • 使用POST方法
  • <input type="file" >是主要使用的檔案瀏覽元素
  • 後端接收的Servlet寫在action屬性裡
<form name="Form1" id="Form1" method="POST" action="/xxx/servlet/com.xxx.test.UploadTest" 
      enctype="multipart/form-data">
  <input type="file" name="FILE" id="FILE" value=""/>
  <input type="hidden" name="DIR" id="DIR"/>
  <input name="btnUpload" id="btnUpload" type="submit" value="上傳檔案" />
</form>

Servlet寫法

  • 以@MultipartConfig(location = “c:/www/xxx/data/")指定寫檔路徑
  • 以request.getPart( )取出Part檔案物件
  • 中文檔名不同的Container系統或版本作法不同,要實際測試一下
 
/* $Id: UploadTest.java 104565 2012-06-15 06:29:48Z jerry $
 */
package com.xxx.test;

import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import java.io.IOException;
import java.io.File;
import java.io.PrintWriter;

/**
 * Upload file from HTML form post.
 *
 * @version: jerry 2012/06/19
 */

@MultipartConfig(location = "c:/www/xxx/data/")
public class UploadTest extends HttpServlet {
  public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {
    req.setCharacterEncoding("UTF-8"); // 為了處理中文檔名
    PrintWriter out = resp.getWriter();

    try {
      Part _oPart = req.getPart("FILE");
      String _sFilename = getFilename(_oPart);  // 檔名由Header取出
      // _sFilename = new String(_sFilename.getBytes("ISO8859_1"),"UTF-8");  // 在不同的code page啟動AP時有時需要轉碼
      System.out.println("Uploaded filename=" + _sFilename);  // debug

      File _oFile = new File("c:/www/xxx/data/" + _sFilename);
      if (_oFile.exists()) _oFile.delete();  // 檔案已存在時先刪除
      _oPart.write(_sFilename);  // saving the uploaded file.

      out.println("上傳成功");
    } catch (Exception e) {
      e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
      out.println("ERR:" + e.getMessage());
    } finally {
    }
  }

  private static String getFilename(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
      if (cd.trim().startsWith("filename")) {
        String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
        return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
      }
    }
    return null;
  }
}

參考

  • Servlet/JSP Gossip: getPart()、getParts()
  • Servlet 3.0笔记之超方便的文件上传支持

##
您可能也會有興趣的類似文章

  • 如何將Markdown文件轉換成HTML? (1則留言, 2011/03/06)
  • [HTML&CSS] 鎖定左側功能選單,不隨頁面捲動 (0則留言, 2007/04/05)
  • 網頁顯示程式碼的美容師:CodePress (0則留言, 2007/03/27)
  • Resin 3.0.18與其PHP引擎 (0則留言, 2006/02/26)
  • JTrac:Open source的Java Issue Tracking System (0則留言, 2008/01/25)
  • [Java] IDEA 5.0觀看JSP檔案的不同View (0則留言, 2005/08/04)
  • Java十年有成 (0則留言, 2005/04/12)
  • [Java] jTDS: SQL Server的JDBC驅動程式 (0則留言, 2005/03/03)
  • Java I18N國際化工具:JRC-Editor (0則留言, 2008/03/01)
  • [ADS] 在Linux上執行Aqua Data Studio (0則留言, 2006/03/16)
  • NetBeans 5.0和亨利.馬諦斯(Matisse) (0則留言, 2006/01/30)
  • 解決 iReport 升級後的問題 (1則留言, 2005/11/22)
  • iReport 0.4測試 (0則留言, 2005/02/12)
  • iReport 0.5更新與Groovy (2則留言, 2005/05/24)
  • 又一個Java寫的資料庫前端工具:Execute Query 3.0 (2則留言, 2006/09/21)

分享:


你可能感兴趣的:(java,html,編程生涯)