1. 程式人生 > 其它 >Servlet實現檔案上傳

Servlet實現檔案上傳

技術標籤:筆記

**要求:**實現圖片上傳(限制字尾以及圖片的大小,將圖片儲存到指定的伺服器中,地址儲存到資料庫中,最後在頁面中顯示出來)
實現步驟:
實現步驟:

1.關聯圖片上傳的jar包(commons-io.jar、commons-fileupload.jar),資料庫驅動包以及jstl相關的jar包(是否需要使用jstl)

2.定義表單,指定enctype屬性以及提交方式為post,同時給定input型別為file的表單

3.解析提交的表單資料(request)

​ a.建立一個DiskFileItemFactory物件,作為ServletFileupload物件的工廠

​ b.建立ServletFileupload物件,通過該物件去解析request物件,返回一個FileItem集合物件

​ c.每個FileItem中包含的就是表單中對應的鍵值對

​ d.判斷是否是檔案物件
加粗樣式>
4.擷取上傳的檔案的字尾與指定的字尾名進行匹配

5.給上傳的檔案起個新名字以保證名字不衝突(UUID、時間戳等等)

6.將該過名字的檔案寫入到指定的伺服器的地址中

7.將檔案的地址寫入到資料庫中進行儲存

8.在前端的頁面中顯示上傳的圖片

前端新增頁面:

 <c:if test="${not empty picSuffix}">
  <p>只能上傳:${picSuffix}</p>
  </c:if>
  <c:if test
="${not empty sizeMsg}">
<p>${sizeMsg}</p> </c:if> <c:remove var="sizeMsg"/> <c:remove var="picSuffix"/> <form action="fileUploadServlet" enctype="multipart/form-data" method="post"> <input
type="text" name="uname">
<input type="file" name="file"> <input type="submit" value="提交"> </form>

後臺上傳圖片檔案程式碼

  request.setCharacterEncoding("utf-8");
        HttpSession session=request.getSession();
        //建立一個讀取磁碟空間的工廠物件
        FileItemFactory factory=new DiskFileItemFactory();
        //通過工廠物件生產ServletFileUpload
        ServletFileUpload fileUpload=new ServletFileUpload(factory);
        try {
            //設定可上傳的檔案大小
            fileUpload.setSizeMax(1024*10);
            //定義允許上傳的檔案字尾格式
            String[] suffixArr={".jpg",".gif",".png",".jpeg"};
            //解析request物件
            List<FileItem> fileItemList=fileUpload.parseRequest(request);
            //遍歷表單中的key val集合,拿到每一個具體的fileItem物件
            for(FileItem fileItem:fileItemList){
                //判斷當前的fileItem是普通的表單資料還是一個檔案上傳物件
                if(fileItem.isFormField()){ //true代表是普通的表單資料
                    String fieldName=fileItem.getFieldName();
                    String fieldVal=fileItem.getString();
                }else{//false代表是檔案上傳
                    String fieldName = fileItem.getFieldName();
                    //getName()獲取上傳的檔案的名字
                    String fieldVal = fileItem.getName();
                    //獲取上傳的檔案的字尾
                    //獲取最後一個點的下標
                    int lastIndex=fieldVal.lastIndexOf(".");
                    //擷取之後的部分
                    String suffix=fieldVal.substring(lastIndex);
                    //判斷獲取到的字尾是否在指定格式中
                    List<String> suffixList= Arrays.asList(suffixArr);
                    if (!suffixList.contains(suffix)){
                        session.setAttribute("picSuffix",suffixList);
                        resp.sendRedirect("index.jsp");
                        return;
                    }else{
                        //獲取伺服器中儲存圖片的資料夾地址 自己建立一個資料夾upload
                        String realPath=request.getRealPath("/upload");
                        //將圖片寫入到指定的伺服器地址中
                        File file=new File(realPath);
                        if (!file.exists()){
                            //如果檔案不存在就建立
                            file.mkdir();
                        }
                        //為檔案生成一個隨機的名字,保證名字不衝突(使用uuid生成)
                        String uuid= UUID.randomUUID().toString();
                        String fileName=uuid.replace("-","")+suffix;
                        File writeFile=new File(realPath,fileName);
                        fileItem.write(writeFile);
                        //將圖片的路徑儲存到資料庫中
                        String sql = "insert into t_item(pic) values(?)";
                        DBUtil.curd(sql,fileName);
                        //跳轉到顯示頁面
                        resp.sendRedirect("show_pic.jsp");
                        return;
                    }
                }
            }
        } catch(SizeLimitExceededException e){
            session.setAttribute("sizeMsg","可上傳的檔案大小:"+fileUpload.getFileSizeMax());
        }
        catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

前端展示程式碼

<%
    String serverPath = request.getContextPath();
    //圖片儲存路徑
    String picPath = serverPath  +"/upload/";
    //獲取到資料庫中的圖片路徑集合
    List<Picture> pictureList = new ArrayList<>();
    Connection connection = DBUtil.newInstance();
    String sql = "select * from t_item";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    ResultSet resultSet = preparedStatement.executeQuery();
    while(resultSet.next()){
        Picture picture = new Picture();
        picture.setId(resultSet.getInt(1));
        picture.setPic(resultSet.getString(2));
        pictureList.add(picture);
    }
//存到域中
    session.setAttribute("pictureList",pictureList);
%>
<c:forEach items="${pictureList}" var="picture">
    <img src="<%=picPath%>${picture.pic}" alt="" width="300px" height="300px" border="1px">
</c:forEach>