1. 程式人生 > >Jsp 使用 fileupload 檔案上傳和下載

Jsp 使用 fileupload 檔案上傳和下載

前言

Jsp檔案上傳的目前主要有兩個常用的:
1、SmartUpload
2、Apache Commons fileupload

我在期末的 Jsp 大作業需要一個檔案上傳下載模組,使用了第2個 Apache 的包,這裡我主要寫寫檔案上傳和下載的普通用法、注意的問題、最重要的是 表單的文字和檔案一塊提交的寫法。

檔案上傳

第一步、我們應該引入2個包:

commons-fileupload-1.2.1.jar
commons-io-1.4.jar

注:這兩個 jar 包配合使用,都需要引入,文末會附上下載連結。此外,這應該不是最新版,有強迫症的同學可以去 apache 看看。

第二步、放上 index.jsp 的表單:

    //略過非重點...
    <form method="post" action="/classhelp/UploadServlet"
        enctype="multipart/form-data">
        <input type="file" name="uploadFile" /> 
        <input name="stuid" type="hidden" value="<%=studentid%>"> 
        <input name="workid"
type="hidden" value="<%=workid%>"> <input class="filesubmit" type="submit" value="上傳作業" /> </form>

我們可以看到:
form 的 method 是 post 的;
form 的內容格式要定義為 multipart/form-data 格式;
form 的 檔案input 的 type 是 file;
對,這三條是必須的!當然這裡表單還有stuid和workid。

第三步、UploadServlet 程式碼

@WebServlet
("/UploadServlet") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; private String filePath; // 檔案存放目錄 private String tempPath; // 臨時檔案目錄 private String studentid; private String workid; private String filename ; private String SQLFileName; // 初始化 public void init(ServletConfig config) throws ServletException { super.init(config); // 可以從配置檔案中獲得初始化引數 //filePath = config.getInitParameter("filepath"); //tempPath = config.getInitParameter("temppath"); //ServletContext context = getServletContext(); //filePath = context.getRealPath(filePath); //tempPath = context.getRealPath(tempPath); filePath="D:/ClassHelpFile/file"; tempPath="D:/ClassHelpFile/temp"; } // doPost public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { //res.setContentType("text/plain;charset=gbk"); PrintWriter pw = res.getWriter(); try { DiskFileItemFactory diskFactory = new DiskFileItemFactory(); // threshold 極限、臨界值,即硬碟快取 1M diskFactory.setSizeThreshold(10 * 1024); // repository 貯藏室,即臨時檔案目錄 diskFactory.setRepository(new File(tempPath)); ServletFileUpload upload = new ServletFileUpload(diskFactory); //防止亂碼 upload.setHeaderEncoding("UTF-8"); // 設定允許上傳的最大檔案大小 4M upload.setSizeMax(10 * 1024 * 1024); // 解析HTTP請求訊息頭 List<FileItem> fileItems = upload.parseRequest(req); Iterator<FileItem> iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { processFormField(item, pw);//處理表單內容 } else { processUploadFile(item, pw);//處理上傳的檔案 } } SQLFileName=tempPath+"/"+filename; System.out.println(workid+" & "+studentid+" & "+SQLFileName); //儲存到資料庫 String sql = "insert into finishwork(workid,studentid,fileurl) values('"+workid+"','"+studentid+"','"+SQLFileName+"')"; Connection conn = DBbean.getConn(); Statement stmt = DBbean.getStatement(conn); DBbean.getResultSetOfInsert(stmt, sql); DBbean.close(stmt); DBbean.close(conn); pw.close(); } catch (Exception e) { System.out.println("異常:使用 fileupload 包發生異常!"); e.printStackTrace(); } RequestDispatcher rd =req.getRequestDispatcher("/student/index_student.jsp?id="+studentid); try{ rd.forward(req, res); return; }catch(Exception e){ System.out.print(e.toString()); } return; } // 處理表單內容 private void processFormField(FileItem item, PrintWriter pw) throws Exception { String name = item.getFieldName(); if(name.equals("stuid")){ studentid = item.getString(); }else if(name.equals("workid")){ workid = item.getString(); } } // 處理上傳的檔案 private void processUploadFile(FileItem item, PrintWriter pw) throws Exception { filename = item.getName(); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long fileSize = item.getSize(); if ("".equals(filename) && fileSize == 0) { System.out.println("檔名為空 !"); return; } File uploadFile = new File(filePath + "/" + filename); item.write(uploadFile); //pw.println(filename + " 檔案儲存完畢 !"); //pw.println("檔案大小為 :" + fileSize + "\r\n"); } // doGet public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { //doPost(req, res); } }

上述程式碼註釋很詳盡,其中,我們可以清楚的看到,處理表單普通內容的 processFormField 方法和處理上傳的檔案的 processUploadFile方法。特別注意 processFormField 方法,需要根據 form 表單的 name 來獲取內容。
這樣我們可以把表單的普通文字和檔案一塊提交啦!

檔案下載

表單就不放了,直接來 DownloadServlet:

/**
 * 檔案下載
 * @author GUOFENG
 *
 */
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String path;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //獲取傳送的檔案路徑
        path = request.getParameter("fileurl");
        if (path != null) {
            download(response);
        }
    }

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

    public void download(HttpServletResponse response) throws IOException {
        //去掉路徑,剩下檔名。
        String realPath = path.substring(path.lastIndexOf("/") + 1);
        // 告訴瀏覽器是以下載的方法獲取到資源,以此種編碼來解析。
        response.setHeader("content-disposition", "attachment; filename="
                + URLEncoder.encode(realPath, "utf-8"));
        // 獲取資源,儲存。
        FileInputStream fis = new FileInputStream(path);
        int len = 0;
        byte[] buf = new byte[1024];
        while ((len = fis.read(buf)) != -1) {
            response.getOutputStream().write(buf, 0, len);
        }
        fis.close();
    }

}

這裡傳入了檔案路徑,獲取檔案進行儲存。

下載jar包

點我下載