javaweb开发之处理表单上传文件和文件下载
生活随笔
收集整理的這篇文章主要介紹了
javaweb开发之处理表单上传文件和文件下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
一、基于表單的上傳文件
1. enctype屬性
當表單需要上傳文件時,需指定表單 enctype 的值為 multipart/form-data。在 form 元素的語法中,enctype 屬性指定將數據發送到服務器時瀏覽器使用的編碼類型。
??
enctype 屬性取值:?
application/x-www-form-urlencoded:表單 enctype 屬性的默認值。這種編碼方案使用有限的字符集,當使用了非字母和數字時,必須用”%HH”代替(H 代表十六進制數字)。對于大容量的二進制數據或包含非 ASCII 字符的文本來說,這種編碼不能滿足要求。
multipart/form-data:form 設定了enctype=“multipart/form-data”屬性后,表示表單以二進制傳輸數據 。
2. Commons-fileupload 組件
Commons-fileupload 組件是 Apache 開源代碼組織用來處理表單文件上傳的一個子項目,該組件性能優異,可以支持任意大小的文件的上傳。Commons-fileupload 組件從 1.1 版本開始依賴 Apache 的另一個項目:commons-io。
Commons-fileupload 組件上傳的基本原理?
FileUpload組件將頁面提交的所有元素(普通form表單域,如text和文件域file)都看作一樣的FileItem,這樣上傳頁面提交的 request請求也就是一個FileItem的有序組合,FileUpload組件可以解析該request,并返回一個一個的FileItem。而對每一個FileItem,FileUpload組件可以判斷出它是普通form表單域還是文件file域,從而根據不同的類型,采取不同的操作。如果是表單域,就讀出其值,如果是文件域,就保存文件到服務器硬盤上或者內存中。
3. 示例
UploadServlet.java
package cn.heimar.upload;import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.UUID;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** 1,限制上傳文件大小 2,限制上傳文件類型 3,設置上傳緩存大小*/ public class UploadServlet extends HttpServlet {private String[] allowedSuffix = new String[] { "JPG", "JPEG", "GIF","BMP", "PNG", "ICO" };@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 判斷上傳的確實是一個包含了文件域的表單boolean isMultipart = ServletFileUpload.isMultipartContent(req);if (isMultipart) {try {// 處理有文件的表單內容// Create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();File folder = new File("C:\\uploadtemp");if(!folder.exists()){folder.mkdirs();}// 設置臨時文件夾factory.setRepository(folder);// 設置緩存區大小factory.setSizeThreshold(3 * 1024 * 1024);// 創建一個上傳處理器ServletFileUpload upload = new ServletFileUpload(factory);// 設置一次請求能夠上傳的文件總大小upload.setSizeMax(10 * 1024 * 1024);// 解析請求List<FileItem> items = upload.parseRequest(req);//FileItem:包裝了普通表單域和文件域的統一對象for (FileItem item : items) {// isFormField是在判斷當前FileItem是不是普通表單域if (item.isFormField()) {// item.getFieldName:表單屬性名稱String name = item.getFieldName();// item.getString:表單屬性值String value = item.getString();System.out.println(name + " " + value);} else {String fieldName = item.getFieldName();String fileName = item.getName();String contentType = item.getContentType();boolean isInMemory = item.isInMemory();long sizeInBytes = item.getSize();// 判斷文件類型是否合法String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);if (Arrays.asList(allowedSuffix).contains(suffix.toUpperCase())) {String writeFileName = UUID.randomUUID().toString();String fp = this.getServletContext().getRealPath("/upload")+ File.separator+ writeFileName+ "."+ suffix;item.write(new File(fp));} else {System.out.println("文件類型不合法");}}}} catch (SizeLimitExceededException fx) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}} else {// 按照普通表單的方法處理}} }upload.jsp
二、文件下載
情景:在一些網絡系統中,需要隱藏下載文件的真實地址,或者下載的文件需要一個程序來動態的確定后在傳送給客戶端。
解決方案:
利用程序編碼實現下載。可以增加安全訪問控制,只對經過授權認證的用戶提供下載;
可以從任意位置提供下載的數據。
利用程序實現下載需要設置 2 個報頭:
Web 服務器需要告訴瀏覽器其所輸出的內容的類型不是普通的文本文件或 HTML 文件,而是一個要保存到本地的下載文件。設置Content-Type 的值為:application/x-msdownloadWeb 服務器希望瀏覽器不直接處理相應的實體內容,而是由用戶選擇將相應的實體內容保存到一個文件中,這需要設置 Content-Disposition 報頭。該報頭指定了接收程序處理數據內容的方式,在 HTTP 應用中只有 attachment 是標準方式,attachment 表示要求用戶干預。在 attachment 后面還可以指定 filename 參數,該參數是服務器建議瀏覽器將實體內容保存到文件中的文件名稱。在設置 Content-Dispostion 之前一定要指定 Content-Type。
示例:
DownloadServlet.java
package cn.heimar.upload;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class DownloadServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String filename = req.getParameter("file");/** 設置響應報頭 contentType: application/x-msdownload -->* 告訴瀏覽器其所輸出的內容的類型不是普通的文本文件或 HTML 文件,而是一個要保存到本地的下載文件*/// response.setHeader("content-type", "application/x-msdownload");resp.setContentType("application/x-msdownload");/** 設置響應報頭 Content-Disposition: attachment Web 服務器希望瀏覽器不直接處理相應的實體內容,* 而是由用戶選擇將相應的實體內容保存到一個文件中*/resp.setHeader("Content-Disposition", "attachment; filename=11111.zip");String filePath = this.getServletContext().getRealPath("/WEB-INF/download")+ File.separator + filename;BufferedInputStream is = new BufferedInputStream(new FileInputStream(filePath));BufferedOutputStream os = new BufferedOutputStream(resp.getOutputStream());byte[] buf = new byte[1024];int len = 0;while ((len = is.read(buf)) != -1) {os.write(buf, 0, len);}is.close();os.close();}} download.jsp <%@ 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>Insert title here</title> </head> <body> <a href="${pageContext.request.contextPath }/download?file=test.zip">點擊下載</a> </body> </html>
轉載于:https://my.oschina.net/hongdengyan/blog/182123
總結
以上是生活随笔為你收集整理的javaweb开发之处理表单上传文件和文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决maven不能自动导入ojdbc14
- 下一篇: Hibernate C3P0连接池配置