1. 程式人生 > 程式設計 >JavaWeb如何實現本地檔案上傳功能

JavaWeb如何實現本地檔案上傳功能

這篇文章主要介紹了JavaWeb如何實現本地檔案上傳功能,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Web中的檔案上傳主要是分為兩步

在Web頁面中設定一個上傳檔案的選項,一般是通過<form><input>兩個標籤實現

在Servlet類中讀取到上傳的檔案,並儲存到伺服器中

記錄實現步驟前先擼一遍需要注意的幾個地方,以及兩個jar包和類的介紹

需要注意的地方

<input>輸入項的type屬性設定為'file',並且必須要設定name屬性,否則瀏覽器將不會發送上傳檔案的資料

<form>表單的method屬性必須設定為'post'方式,enctype屬性設定為‘multipart/form-data'

要用到的jar包和類的介紹

為了解決使用者一次性上傳多個檔案的需求,Apache提供了一個元件FileUploat,這個檔案實現了多個檔案同時上傳而且可以限制上傳檔案的大小,使用這個元件需要去Apache官網下載兩個jar包:commons-fileupload-1.4.jar、commons-io-2.6.jar
要用到FileUpload元件中的FileItem介面、DiskFileItemFactory類和ServletFileUpload類(這些類裡的方法就不寫了,在專案裡直接用了)

用一張圖就可以很清楚的表示出這幾個類的作用了

JavaWeb如何實現本地檔案上傳功能

下面就是實現步驟了

第一步:匯入上面提到的要用到的兩個jar包

第二步:建立上傳頁面

<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title></title>

</head>
<body>

<form enctype="multipart/form-data" method="post" action="cn.itcast.fileupload.UploadServlet">

  <%--上傳者--%>
  <input type="text" name="name">
  <%--上傳檔案--%>
  <input type="file" name="myfile">
  <input type="submit" value="上傳">

</form>
</body>
</html>

第三步:建立一個Servlet類,對上傳的檔案進行處理

package cn.itcast.fileupload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class UploadServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {

    try {
//      設定ContentType欄位
      resp.setContentType("text/html;charset=utf8");
//     建立DiskFileItemFactory工廠物件,可以將請求訊息實體中的每一個檔案封裝成單獨的FielItem物件
      DiskFileItemFactory factory = new DiskFileItemFactory();

//     設定檔案快取目錄,如果該檔案不存在則新建立一個
      File f = new File("/Users/liuliu/Desktop/my");
      if (!f.exists()) {
        f.mkdir();
      }

//      設定檔案的快取路徑
      factory.setRepository(f);
//      建立一個ServletFileUpload物件
      ServletFileUpload fileUpload = new ServletFileUpload(factory);
//      設定字元編碼
      fileUpload.setHeaderEncoding("utf-8");

//      解析request,得到上傳檔案的FileItem物件
      List<FileItem> fileItems = fileUpload.parseRequest(req);
//      獲取字元流
      PrintWriter writer = resp.getWriter();

//      遍歷物件fileItems物件的List集合
      for (FileItem fileItem : fileItems) {
//        判斷當前的FileItem物件封裝的資料是"普通文字表單欄位"
        if (fileItem.isFormField()) {
//          獲得上傳的表單欄位的name屬性值
          String name = fileItem.getFieldName();
          if (name.equals("name")) {
//            如果FileItem物件中儲存的資料流不為空,則返回一個字串,並通過print輸出
            if (!fileItem.getString().equals("")) {
              String value = fileItem.getString("utf-8");
              writer.print("上傳者:" + value + "<br/>");
            }
          }
        } else {//判斷當前的FileItem物件封裝的資料是"檔案表單欄位"
//          獲得上傳檔案的檔名
          String filename = fileItem.getName();
          if (fileItem != null && !fileItem.equals("")) {
            writer.print("上傳的檔名稱是" + filename + "<br/>");
//            截取出檔名
            filename = filename.substring(filename.lastIndexOf("\\") + 1);
//            給定檔名一個唯一的id
            filename = UUID.randomUUID().toString() + "_" + filename;

//            在伺服器中建立同名檔案
            String webPath = "/myima/";
//            將伺服器中資料夾路徑與檔名組合成完整的伺服器端路徑
            String filePath = getServletContext().getRealPath(webPath + filename);

//            建立檔案
            File file = new File(filePath);
            file.getParentFile().mkdir();
            file.createNewFile();

//            獲得上傳檔案流
            InputStream in = fileItem.getInputStream();
//            開啟伺服器端的上傳檔案
            FileOutputStream fileOutputStream = new FileOutputStream(file);

//            流的對拷
            byte buffer[] = new byte[1024];
            int len;
            while ((len = in.read(buffer)) > 0) {
              fileOutputStream.write(buffer,len);
              in.close();
              fileOutputStream.close();
              fileItem.delete();
              writer.print("上傳檔案成功");

            }
          }
        }
      }


    } catch (FileUploadException e) {
      e.printStackTrace();
    }
  }


  @Override
  protected void doPost(HttpServletRequest req,IOException {
    doGet(req,resp);
  }

}


上傳幾個檔案測試了下,可以看到myima檔案成功建立了,檔案也成功上傳到這裡了

JavaWeb如何實現本地檔案上傳功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。