JAVA使用commos-fileupload實現(xiàn)文件上傳與下載實例解析
更新時間:2016年02月01日 16:49:07 作者:森林森
這篇文章主要介紹了JAVA使用commos-fileupload實現(xiàn)文件上傳與下載的相關(guān)資料,需要的朋友可以參考下
首先給大家介紹一文件的上傳
實體類
import java.sql.Timestamp; /** * * @Decription 文件上傳實體類 * */ public class Upfile { private String id;// ID主鍵 使用uuid隨機生成 private String uuidname; // UUID名稱 private String filename;//文件名稱 private String savepath; // 保存路徑 private Timestamp uploadtime; // 上傳時間 private String description;// 文件描述 private String username; // 用戶名 public Upfile() { super(); } public Upfile(String id, String uuidname, String filename, String savepath, Timestamp uploadtime, String description, String username) { super(); this.id = id; this.uuidname = uuidname; this.filename = filename; this.savepath = savepath; this.uploadtime = uploadtime; this.description = description; this.username = username; } public String getDescription() { return description; } public String getFilename() { return filename; } public String getId() { return id; } public String getSavepath() { return savepath; } public Timestamp getUploadtime() { return uploadtime; } public String getUsername() { return username; } public String getUuidname() { return uuidname; } public void setDescription(String description) { this.description = description; } public void setFilename(String filename) { this.filename = filename; } public void setId(String id) { this.id = id; } public void setSavepath(String savepath) { this.savepath = savepath; } public void setUploadtime(Timestamp uploadtime) { this.uploadtime = uploadtime; } public void setUsername(String username) { this.username = username; } public void setUuidname(String uuidname) { this.uuidname = uuidname; } }
頁面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'upload.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>文件上傳</h1> <form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data"> <table> <tr> <td> 上傳用戶名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td> 上傳文件:</td> <td><input type="file" name="file"/></td> </tr> <tr> <td> 描述:</td> <td><textarea rows="5" cols="50" name="description"></textarea></td> </tr> <tr> <td><input type="submit" value="上傳開始"/></td> </tr> </table> </form> <div>${msg }</div> <a href="${pageContext.request.contextPath }/index.jsp">返回主頁</a> </body> </html>
Servlet
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.itheima.domain.Upfile; import com.itheima.exception.MyException; import com.itheima.service.UpfileService; import com.itheima.service.impl.UpfileServiceImpl; import com.itheima.untils.WebUntil; public class UploadFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //判斷表單是不是多個部分組成的 if(!ServletFileUpload.isMultipartContent(request)){ request.setAttribute("msg", "表單個設(shè)置錯誤,請檢查enctype屬性是是否設(shè)置正確"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return ; } //是多部分組成的就獲取并遍歷返回一個文件上傳對象,包含上傳的所有信息 try { Upfile upfile=WebUntil.upload(request); UpfileService upfileService=new UpfileServiceImpl(); boolean flag=upfileService.add(upfile); if(flag){ request.setAttribute("msg", "上傳成功"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return ; }else{ request.setAttribute("msg", "上傳失敗,請重試"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return ; } }catch (FileSizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("msg", "單個文件大小 ,超過最大限制"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return ; } catch (SizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("msg", "總文件大小 ,超過最大限制"); request.getRequestDispatcher("/upload.jsp").forward(request, response); return ; } } }
工具類
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException; import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.itheima.domain.Upfile; import com.itheima.exception.MyException; /** * 文件上傳工具類 * @Decription TODO * */ public class WebUntil { /** * 文件上傳的方法 * @param request 請求參數(shù)傳入 * @return 返回一個Upfile對象 * @throws FileSizeLimitExceededException * @throws SizeLimitExceededException * @throws IOException */ public static Upfile upload(HttpServletRequest request) throws FileSizeLimitExceededException, SizeLimitExceededException { Upfile upfile=new Upfile(); ArrayList<String> fileList=initList(); try { //獲取磁盤文件對象工廠 DiskFileItemFactory factory=new DiskFileItemFactory(); String tmp=request.getSession().getServletContext().getRealPath("/tmp"); System.out.println(tmp); //初始化工廠 setFactory(factory,tmp); //獲取文件上傳解析器 ServletFileUpload upload=new ServletFileUpload(factory); //初始化解析器 setUpload(upload); //獲取文件列表集合 List<FileItem> list = upload.parseRequest(request); //遍歷 for (FileItem items : list) { //判斷 是不是普通表單個對象 if(items.isFormField()){ //獲取上傳表單的name String fieldName=items.getFieldName(); //value String fieldValue=items.getString("UTF-8"); //判斷 if("username".equals(fieldName)){ //設(shè)置 upfile.setUsername(fieldValue); }else if("description".equals(fieldName)){ //設(shè)置屬性 upfile.setDescription(fieldValue); } }else{ //是文件就準(zhǔn)備上傳 //獲取文件名 String filename=items.getName(); //處理因為瀏覽器不同而導(dǎo)致的 獲得 的 文件名的 差異 int index=filename.lastIndexOf("\\"); if(index!=-1){ filename=filename.substring(index+1); } //生成隨機的文件名 String uuidname=generateFilename(filename); //獲取上傳的文件路徑 String savepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload"); //獲取請求對象中的輸入流 InputStream in = items.getInputStream(); //將文件打散存放在不同的路徑,求出路徑 savepath=generateRandomDir(savepath,uuidname); //復(fù)制文件 uploadFile(in,savepath,uuidname); String id=UUID.randomUUID().toString(); upfile.setId(id); upfile.setSavepath(savepath); upfile.setUuidname(uuidname); upfile.setFilename(filename); //清除緩存 items.delete(); } } }catch ( FileUploadBase.FileSizeLimitExceededException e) { //拋出出異常 throw e; } catch (FileUploadBase.SizeLimitExceededException e) { //拋出出異常 throw e; }catch (FileUploadException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return upfile; } /** * 初始化文件列表 * @return */ private static ArrayList<String> initList() { ArrayList<String> list=new ArrayList<String>(); list.add(".jpg"); list.add(".rar"); list.add(".txt"); list.add(".png"); return list; } /** * 復(fù)制文件 * @param in items中的輸入流 * @param savepath 保存路徑 * @param uuidname 文件名 */ private static void uploadFile(InputStream in, String savepath, String uuidname) { //獲取文件 File file=new File(savepath, uuidname); OutputStream out = null; try { int len=0; byte [] buf=new byte[1024]; //獲取輸出流 out = new FileOutputStream(file); while((len=in.read(buf))!=-1){ out.write(buf, 0, len); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 生成隨機的存放路徑 * @param savepath 保存路徑 * @param uuidname 生成的uuid名稱 * @return * 使用hashcode完成 */ private static String generateRandomDir(String savepath, String uuidname) { //轉(zhuǎn)化為hashcode System.out.println("上傳路徑"+savepath); System.out.println("UUIDNAME"+uuidname); int hashcode=uuidname.hashCode(); //容器 StringBuilder sb=new StringBuilder(); while(hashcode>0){ //與上15 int tmp=hashcode&0xf; sb.append("/"); sb.append(tmp+""); hashcode=hashcode>>4; } //拼接新的路徑 String path=savepath+sb.toString(); System.out.println("path"+path); File file=new File(path); //判斷路徑存不存在 if(!file.exists()){ //不存在就創(chuàng)建 file.mkdirs(); } //返回保存路徑 return path; } /** * 生成新的文件名 * @param uuidname 隨機的ID名字 * @param filename 原來的名 * @return */ private static String generateFilename( String filename) { String uuidname=UUID.randomUUID().toString(); return uuidname.replace("-", "").toString()+"_"+filename; } /** * 初始化解析器 * @param upload */ private static void setUpload(ServletFileUpload upload) { // 設(shè)置 字符編碼 upload.setHeaderEncoding("utf-8"); //設(shè)置文件大小 upload.setFileSizeMax(1024*1024*20); //設(shè)置總文件大小 upload.setSizeMax(1024*1024*50); //設(shè)置進度監(jiān)聽器 upload.setProgressListener(new ProgressListener() { public void update(long pBytesRead, long pContentLength, int pItems) { System.out.println("已經(jīng)讀取: "+pBytesRead+",總共有: "+pContentLength+", 第"+pItems+"個"); } }); } /** * 工廠初始化方法 * @param factory * @param tmp 緩沖目錄 */ private static void setFactory(DiskFileItemFactory factory, String tmp) { /// 配置初始化值緩沖區(qū) factory.setSizeThreshold(1024*1024); File file=new File(tmp); //設(shè)置緩沖目錄 factory.setRepository(file); } }
二文件下載
Servlet
public class DownupfileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取ID String id=request.getParameter("id"); //業(yè)務(wù)層的接口 UpfileService upfileService=new UpfileServiceImpl(); //根據(jù)ID查找這個對象 Upfile upfile=upfileService.findUpfileById(id); if(upfile==null){ return; } //獲取文件的真實名稱 String filename=upfile.getFilename(); //如果文件名中有中文,需要轉(zhuǎn)碼,不然就下載時沒有文件名 filename=URLEncoder.encode(filename, "utf-8"); //更改過的名稱 String uuidname=upfile.getUuidname(); //保存路徑 String savepath=upfile.getSavepath(); File file=new File(savepath,uuidname); //判斷文件 是否存在 if(!file.exists()){ request.setAttribute("msg", "下載 的文件過期了"); request.getRequestDispatcher("/index").forward(request, response); return; } //設(shè)置文件下載響應(yīng)頭信息 response.setHeader("Content-disposition", "attachement;filename="+filename); //使用IO流輸出 InputStream in = new FileInputStream(file); ServletOutputStream out = response.getOutputStream(); int len=0; byte [] buf=new byte[1024]; while((len=in.read(buf))!=-1){ out.write(buf, 0, len); } in.close(); } }
數(shù)據(jù)庫
create database upload_download_exercise; use upload_download_exercise; create table upfiles( id varchar(100), //使用UUID生成 uuidname varchar(255),//uuid加上原來的文件名 filename varchar(100),//真實文件名 savepath varchar(255),//保存路徑 uploadtime timestamp,//上傳時間 description varchar(255),//描述 username varchar(10) 上傳人 );
以上所述是小編給大家分享的JAVA使用commos-fileupload實現(xiàn)文件上傳與下載的相關(guān)內(nèi)容,希望對大家有所幫助。
您可能感興趣的文章:
- java組件SmartUpload和FileUpload實現(xiàn)文件上傳功能
- Java中使用fileupload組件實現(xiàn)文件上傳功能的實例代碼
- java使用common-fileupload實現(xiàn)文件上傳
- java組件commons-fileupload實現(xiàn)文件上傳、下載、在線打開
- Java組件commons fileupload實現(xiàn)文件上傳功能
- JavaEE組件commons-fileupload實現(xiàn)文件上傳、下載
- java組件commons-fileupload文件上傳示例
- java組件fileupload文件上傳demo
- java組件commons-fileupload實現(xiàn)文件上傳
- 使用fileupload組件實現(xiàn)文件上傳功能
相關(guān)文章
Java設(shè)計模式之命令模式(Command模式)介紹
這篇文章主要介紹了Java設(shè)計模式之命令模式(Command模式)介紹,本文講解了Command模式的定義、如何使用命令模式等內(nèi)容,需要的朋友可以參考下2015-03-03Springboot設(shè)置文件上傳大小限制的實現(xiàn)示例
Spring Boot工程嵌入的tomcat限制了請求的文件大小默認為1MB,單次請求的文件的總數(shù)不能大于10Mb,本文主要介紹了Springboot設(shè)置文件上傳大小限制的實現(xiàn)示例,感興趣的可以了解一下2023-11-11Java SSM整合開發(fā)統(tǒng)一結(jié)果封裝詳解
這篇文章主要介紹了Java SSM整合開發(fā)實現(xiàn)統(tǒng)一結(jié)果封裝,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08maven?springboot如何將jar包打包到指定目錄
這篇文章主要介紹了maven?springboot如何將jar包打包到指定目錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Kotlin + Retrofit + RxJava簡單封裝使用詳解
這篇文章主要介紹了Kotlin + Retrofit + RxJava簡單封裝使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07