JavaWeb檔案的上傳和下載
阿新 • • 發佈:2018-11-11
檔案的上傳
servlet3.0本身具有檔案上傳功能
這裡我們使用第三方開源 fileupload 實現檔案的上傳
後臺實現上傳功能類:(當檔案上傳的時候,後臺需要去解析請求物件【資料仍然在請求物件中】)
/** * fileupload實現檔案上傳功能步驟: * ①匯入jar包,建立上傳頁面 commons-fileupload-1.2.2.jar,commons-io-1.4.jar * ②解析請求型別,獲取請求中的檔案項 * ③遍歷檔案項,判斷普通項和檔案項 * ④獲取上傳的檔名稱 * ⑤儲存資料:將檔案寫入到伺服器本地 * @author 鄭清 */ @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { FileItemFactory factory = new DiskFileItemFactory();//建立檔案磁碟工廠物件 ServletFileUpload upload = new ServletFileUpload(factory);//根據檔案磁碟工廠物件建立檔案解析器物件 List<FileItem> items = upload.parseRequest(req);//解析請求型別,獲得檔案項,進行檔案上傳時,分為普通項和檔案項 List<FileItem>:前端頁面提交的資料被封裝到FileItem // 遍歷 ==> 判斷資料型別 for (FileItem fileItem : items) { if (fileItem.isFormField()) { //普通項 isFormFiled:true->普通資料,false->檔案資料 System.out.println(fileItem.getString("UTF-8"));//獲取普通項 } else { //檔案項 ServletContext context = getServletContext(); String name = fileItem.getName();//獲取檔案上傳的名稱 //判讀上傳的檔案是否是一個圖片 String mimeType = context.getMimeType(name); if (mimeType==null||!mimeType.startsWith("image/")) { System.out.println("===不屬於圖片型別...==="); return; } String extension = FilenameUtils.getExtension(name);//獲取檔案字尾名 String newName = UUID.randomUUID().toString() + "." + extension;//防止上傳的檔案同名 //servlet中 獲取到本地絕對路徑 String realPath = context.getRealPath("/upload"); File f = new File(realPath, newName); fileItem.write(f);//將檔案寫入本地 } } } catch (Exception e) { e.printStackTrace(); } } }
前端上傳頁面:
注意: ①需要使用post提交
②form表單新增屬性:enctype="multipart/form-data" (form表單預設不會將檔案的資料上傳,只會上傳普通的資料設定了該屬性之後,瀏覽器會將檔案資料提交給伺服器)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首頁</title> </head> <body> <h1>檔案上傳</h1> <form action="/zq/upload" method="post" enctype="multipart/form-data" > 使用者名稱:<input type="text" name="username" ><br/> 上傳頭像:<input type="file" name="imgupload" ><br/> <input type="submit" > </form> </body> </html>
檔案的下載
超連結下載
注意:如果是瀏覽器支援的檔案型別,瀏覽器會直接開啟檔案,注意:需要準備一個資料夾存放下載檔案
也就是說如果超連結指向的資源【文件、圖片、視訊】,瀏覽器支援的檔案型別預設可以開啟,那麼瀏覽器會選擇直接開啟 ,當瀏覽器打不開資源時,就執行下載
<a href="${pageContext.request.contextPath }/download/1.txt" >下載文字文件</a><br/>
<a href="${pageContext.request.contextPath }/download/1.jpg" >下載圖片</a><br/>
程式下載
注意:前臺還是使用超連結,超連結轉到後臺servlet,在servlet通過流的方式把檔案複製到前臺
<a href="${pageContext.request.contextPath }/download?filename=1.txt" >下載文字文件</a><br/>
<a href="${pageContext.request.contextPath }/download?filename=1.jpg" >下載圖片</a><br/>
後臺實現下載功能類:
/**
* 檔案下載:
* ①獲取前臺要下載的檔名稱
* ②設定響應型別
* ③設定下載頁顯示的檔名
* ④獲取下載資料夾的絕對路徑和檔名合併為File型別
* ⑤將檔案複製到瀏覽器
* @author 鄭清
*/
@WebServlet("/download")
public class DownLoadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String realPath = getServletContext().getRealPath("/download");//獲取下載檔案路徑
String filename = req.getParameter("filename");//獲取前臺傳過來的名稱
File file = new File(realPath,filename);//把下載檔案構成一個檔案處理
//設定響應型別 ==》 告訴瀏覽器當前是下載操作,我要下載東西
resp.setContentType("application/x-msdownload");
//設定下載時檔案的顯示型別(即檔名稱-字尾) ex:txt為文字型別
resp.setHeader("Content-Disposition","attachment;filename="+filename);
//下載檔案:將一個路徑下的檔案資料轉到一個輸出流中,也就是把伺服器檔案通過流寫(複製)到瀏覽器端
Files.copy(file.toPath(), resp.getOutputStream());//Files.copy(要下載的檔案路徑,響應的輸出流)
}
}
點選下載專案資源 密碼:8wf2