JAVA使用commos-fileupload實(shí)現(xiàn)文件上傳與下載實(shí)例解析
首先給大家介紹一文件的上傳
實(shí)體類
import java.sql.Timestamp;
/**
*
* @Decription 文件上傳實(shí)體類
*
*/
public class Upfile {
private String id;// ID主鍵 使用uuid隨機(jī)生成
private String uuidname; // UUID名稱
private String filename;//文件名稱
private String savepath; // 保存路徑
private Timestamp uploadtime; // 上傳時(shí)間
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 {
//判斷表單是不是多個(gè)部分組成的
if(!ServletFileUpload.isMultipartContent(request)){
request.setAttribute("msg", "表單個(gè)設(shè)置錯(cuò)誤,請(qǐng)檢查enctype屬性是是否設(shè)置正確");
request.getRequestDispatcher("/upload.jsp").forward(request, response);
return ;
}
//是多部分組成的就獲取并遍歷返回一個(gè)文件上傳對(duì)象,包含上傳的所有信息
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", "上傳失敗,請(qǐng)重試");
request.getRequestDispatcher("/upload.jsp").forward(request, response);
return ;
}
}catch (FileSizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("msg", "單個(gè)文件大小 ,超過最大限制");
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 請(qǐng)求參數(shù)傳入
* @return 返回一個(gè)Upfile對(duì)象
* @throws FileSizeLimitExceededException
* @throws SizeLimitExceededException
* @throws IOException
*/
public static Upfile upload(HttpServletRequest request) throws FileSizeLimitExceededException, SizeLimitExceededException {
Upfile upfile=new Upfile();
ArrayList<String> fileList=initList();
try {
//獲取磁盤文件對(duì)象工廠
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) {
//判斷 是不是普通表單個(gè)對(duì)象
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();
//處理因?yàn)闉g覽器不同而導(dǎo)致的 獲得 的 文件名的 差異
int index=filename.lastIndexOf("\\");
if(index!=-1){
filename=filename.substring(index+1);
}
//生成隨機(jī)的文件名
String uuidname=generateFilename(filename);
//獲取上傳的文件路徑
String savepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//獲取請(qǐng)求對(duì)象中的輸入流
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();
}
}
}
/**
* 生成隨機(jī)的存放路徑
* @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 隨機(jī)的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è)置進(jìn)度監(jiān)聽器
upload.setProgressListener(new ProgressListener() {
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("已經(jīng)讀取: "+pBytesRead+",總共有: "+pContentLength+", 第"+pItems+"個(gè)");
}
});
}
/**
* 工廠初始化方法
* @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查找這個(gè)對(duì)象
Upfile upfile=upfileService.findUpfileById(id);
if(upfile==null){
return;
}
//獲取文件的真實(shí)名稱
String filename=upfile.getFilename();
//如果文件名中有中文,需要轉(zhuǎn)碼,不然就下載時(shí)沒有文件名
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),//真實(shí)文件名 savepath varchar(255),//保存路徑 uploadtime timestamp,//上傳時(shí)間 description varchar(255),//描述 username varchar(10) 上傳人 );
以上所述是小編給大家分享的JAVA使用commos-fileupload實(shí)現(xiàn)文件上傳與下載的相關(guān)內(nèi)容,希望對(duì)大家有所幫助。
- java組件SmartUpload和FileUpload實(shí)現(xiàn)文件上傳功能
- Java中使用fileupload組件實(shí)現(xiàn)文件上傳功能的實(shí)例代碼
- java使用common-fileupload實(shí)現(xiàn)文件上傳
- java組件commons-fileupload實(shí)現(xiàn)文件上傳、下載、在線打開
- Java組件commons fileupload實(shí)現(xiàn)文件上傳功能
- JavaEE組件commons-fileupload實(shí)現(xiàn)文件上傳、下載
- java組件commons-fileupload文件上傳示例
- java組件fileupload文件上傳demo
- java組件commons-fileupload實(shí)現(xiàn)文件上傳
- 使用fileupload組件實(shí)現(xiàn)文件上傳功能
相關(guān)文章
spring boot整合netty的實(shí)現(xiàn)方法
這篇文章主要介紹了spring boot整合netty的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
java基礎(chǔ)之接口組成更新的實(shí)現(xiàn)
本文主要介紹了java基礎(chǔ)之接口組成更新的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
javaDSL簡(jiǎn)單實(shí)現(xiàn)示例分享
DSL領(lǐng)域定義語言,用來描述特定領(lǐng)域的特定表達(dá)。比如畫圖從起點(diǎn)到終點(diǎn);路由中的從A到B。這是關(guān)于畫圖的一個(gè)簡(jiǎn)單實(shí)現(xiàn)2014-03-03
Jenkins一鍵打包部署SpringBoot應(yīng)用的方法步驟
本文主要介紹了使用Jenkins一鍵打包部署SpringBoot應(yīng)用的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
詳解Spring Aop實(shí)例之AspectJ注解配置
本篇文章主要介紹了詳解Spring Aop實(shí)例之AspectJ注解配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Java中使用正則表達(dá)式獲取網(wǎng)頁中所有圖片的路徑
這篇文章主要介紹了Java中使用正則表達(dá)式獲取網(wǎng)頁中所有圖片的路徑,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06
SpringMvc獲取請(qǐng)求頭請(qǐng)求體消息過程解析
這篇文章主要介紹了SpringMvc獲取請(qǐng)求頭請(qǐng)求體消息過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
spring boot使用@Async異步注解的實(shí)現(xiàn)原理+源碼
通常我們都是采用多線程的方式來實(shí)現(xiàn)上述業(yè)務(wù)功能,但spring 提供更優(yōu)雅的方式來實(shí)現(xiàn)上述功能,就是@Async 異步注解,在方法上添加@Async,spring就會(huì)借助AOP,異步執(zhí)行方法,接下來通過本文給大家介紹spring boot異步注解的相關(guān)知識(shí),一起看看吧2021-06-06
java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例
本文主要介紹了java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06
解決Springboot-application.properties中文亂碼問題
這篇文章主要介紹了解決Springboot-application.properties中文亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

