實現文件的上傳和下載首先須要理解幾個知識,這樣才能夠很好的完成文件的上傳和下載;javascript
(1):上傳文件是上傳到服務器上,而保存到數據庫是文件名
(2):上傳文件是以文件轉換爲二進制流的形式上傳的
(3): enctype="multipart/form-data"須要設置在form裏面,不然沒法提交文件 (4):必須在servlet3.0裏面加上這句話,@MultipartConfig html
1:首先建立一個前臺頁面upload.jsp,源碼以下所示:java
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>文件上傳頁面</title> 8 </head> 9 <body> 10 <script type="text/javascript"> 11 alert("${info}"); 12 </script> 13 14 <!-- 上傳文件是上傳到服務器上,而保存到數據庫是文件名 --> 15 <!-- 上傳文件是以文件轉換爲二進制流的形式上傳的 --> 16 <!-- enctype="multipart/form-data"須要設置在form裏面,不然沒法提交文件 --> 17 <form action="upload" method="post" enctype="multipart/form-data"> 18 <table> 19 <tr> 20 <td></td> 21 <td><h1>文件上傳</h1></td> 22 </tr> 23 <tr> 24 <td>文件描述:</td> 25 <td><input type="text" name="desc"/></td> 26 </tr> 27 <tr> 28 <td>上傳文件:</td> 29 <td><input type="file" name="file"/></td> 30 </tr> 31 <tr> 32 <td></td> 33 <td><input type="submit" value="上傳文件"/></td> 34 </tr> 35 </table> 36 </form> 37 </body> 38 </html>
2:在webcontent目錄下面建立一個文件夾upload用於存放上傳到服務器的文件;web
3:建立後臺處理頁面servlet,文件名如UploadServlet.java,源碼以下所示;數據庫
1 package com.bie; 2 3 import java.io.IOException; 4 import java.util.UUID; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.annotation.MultipartConfig; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import javax.servlet.http.Part; 13 14 /** 15 * @author BieHongLi 16 * @version 建立時間:2017年3月4日 下午5:29:03 17 * 注意:上傳文件必須添加@MultipartConfig()能夠設置上傳文件的大小 18 */ 19 @WebServlet("/upload") 20 @MultipartConfig 21 public class UploadServlet extends HttpServlet{ 22 23 24 private static final long serialVersionUID = 1L; 25 26 @Override 27 protected void doPost(HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException { 29 try { 30 //獲取文件描述信息 31 String desc=request.getParameter("desc"); 32 //獲取上傳的文件 33 Part part=request.getPart("file"); 34 //獲取請求的信息 35 String name=part.getHeader("content-disposition"); 36 //System.out.println(name);//測試使用 37 //System.out.println(desc);// 38 39 //獲取上傳文件的目錄 40 String root=request.getServletContext().getRealPath("/upload"); 41 System.out.println("測試上傳文件的路徑:"+root); 42 43 //獲取文件的後綴 44 String str=name.substring(name.lastIndexOf("."), name.length()-1); 45 System.out.println("測試獲取文件的後綴:"+str); 46 47 //生成一個新的文件名,不重複,數據庫存儲的就是這個文件名,不重複的 48 String filename=root+"\\"+UUID.randomUUID().toString()+str; 49 System.out.println("測試產生新的文件名:"+filename); 50 51 //上傳文件到指定目錄,不想上傳文件就不調用這個 52 part.write(filename); 53 54 request.setAttribute("info", "上傳文件成功"); 55 } catch (Exception e) { 56 e.printStackTrace(); 57 request.setAttribute("info", "上傳文件失敗"); 58 } 59 60 request.getRequestDispatcher("/upload.jsp").forward(request, response); 61 } 62 63 }
演示效果以下所示:注意上傳文件所在的目錄,以下圖所示;服務器
1:下載是在上傳的基礎上增長了一些內容,源碼以下所示:
session
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>文件上傳頁面</title> 9 </head> 10 <body> 11 <script type="text/javascript"> 12 alert("${info}"); 13 </script> 14 15 <!-- 上傳文件是上傳到服務器上,而保存到數據庫是文件名 --> 16 <!-- 上傳文件是以文件轉換爲二進制流的形式上傳的 --> 17 <!-- enctype="multipart/form-data"須要設置在form裏面,不然沒法提交文件 --> 18 <form action="upload" method="post" enctype="multipart/form-data"> 19 <table> 20 <tr> 21 <td></td> 22 <td><h1>文件上傳</h1></td> 23 </tr> 24 <tr> 25 <td>文件描述:</td> 26 <td><input type="text" name="desc"/></td> 27 </tr> 28 <tr> 29 <td>上傳文件:</td> 30 <td><input type="file" name="file"/></td> 31 </tr> 32 <tr> 33 <td></td> 34 <td><input type="submit" value="上傳文件"/></td> 35 </tr> 36 </table> 37 </form> 38 39 <div> 40 <h2>下載文件</h2> 41 <c:forEach items="${files }" var="name"> 42 <a href="upload/${name }">${name }</a><br/> 43 </c:forEach> 44 </div> 45 </body> 46 </html>
1 package com.bie; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 import java.util.UUID; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.MultipartConfig; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 import javax.servlet.http.HttpSession; 15 import javax.servlet.http.Part; 16 17 /** 18 * @author BieHongLi 19 * @version 建立時間:2017年3月4日 下午5:29:03 20 * 注意:上傳文件必須添加@MultipartConfig()能夠設置上傳文件的大小 21 */ 22 @WebServlet("/upload") 23 @MultipartConfig 24 public class UploadServlet extends HttpServlet{ 25 26 27 private static final long serialVersionUID = 1L; 28 29 @Override 30 protected void doPost(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 //模擬數據庫存儲文件名 33 HttpSession session=request.getSession(); 34 List<String> list=(List<String>)session.getAttribute("files"); 35 if(list==null){ 36 //若是集合爲空,就建立一個集合 37 list=new ArrayList<String>(); 38 } 39 40 try { 41 //獲取文件描述信息 42 String desc=request.getParameter("desc"); 43 //獲取上傳的文件 44 Part part=request.getPart("file"); 45 //獲取請求的信息 46 String name=part.getHeader("content-disposition"); 47 //System.out.println(name);//測試使用 48 //System.out.println(desc);// 49 50 //獲取上傳文件的目錄 51 String root=request.getServletContext().getRealPath("/upload"); 52 System.out.println("測試上傳文件的路徑:"+root); 53 54 //獲取文件的後綴 55 String str=name.substring(name.lastIndexOf("."), name.length()-1); 56 System.out.println("測試獲取文件的後綴:"+str); 57 58 //生成一個新的文件名,不重複,數據庫存儲的就是這個文件名,不重複的 59 String fname=UUID.randomUUID().toString()+str; 60 //將文件名保存到集合中 61 list.add(fname); 62 //將保存在集合中的文件名保存到域中 63 session.setAttribute("files", list); 64 65 String filename=root+"\\"+fname; 66 System.out.println("測試產生新的文件名:"+filename); 67 68 //上傳文件到指定目錄,不想上傳文件就不調用這個 69 part.write(filename); 70 71 request.setAttribute("info", "上傳文件成功"); 72 } catch (Exception e) { 73 e.printStackTrace(); 74 request.setAttribute("info", "上傳文件失敗"); 75 } 76 77 request.getRequestDispatcher("/upload.jsp").forward(request, response); 78 } 79 80 }
革命還沒有成功,別先生仍需努力啊!!!dom