JAVA使用commos-fileupload实现文件上传与下载实例解析
首先给大家介绍一文件的上传
实体类
importjava.sql.Timestamp;
/**
*
*@Decription文件上传实体类
*
*/
publicclassUpfile{
privateStringid;//ID主键使用uuid随机生成
privateStringuuidname;//UUID名称
privateStringfilename;//文件名称
privateStringsavepath;//保存路径
privateTimestampuploadtime;//上传时间
privateStringdescription;//文件描述
privateStringusername;//用户名
publicUpfile(){
super();
}
publicUpfile(Stringid,Stringuuidname,Stringfilename,Stringsavepath,
Timestampuploadtime,Stringdescription,Stringusername){
super();
this.id=id;
this.uuidname=uuidname;
this.filename=filename;
this.savepath=savepath;
this.uploadtime=uploadtime;
this.description=description;
this.username=username;
}
publicStringgetDescription(){
returndescription;
}
publicStringgetFilename(){
returnfilename;
}
publicStringgetId(){
returnid;
}
publicStringgetSavepath(){
returnsavepath;
}
publicTimestampgetUploadtime(){
returnuploadtime;
}
publicStringgetUsername(){
returnusername;
}
publicStringgetUuidname(){
returnuuidname;
}
publicvoidsetDescription(Stringdescription){
this.description=description;
}
publicvoidsetFilename(Stringfilename){
this.filename=filename;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicvoidsetSavepath(Stringsavepath){
this.savepath=savepath;
}
publicvoidsetUploadtime(Timestampuploadtime){
this.uploadtime=uploadtime;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicvoidsetUuidname(Stringuuidname){
this.uuidname=uuidname;
}
}
页面
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
<html>
<head>
<basehref="<%=basePath%>">
<title>MyJSP'upload.jsp'startingpage</title>
<metahttp-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control"content="no-cache">
<metahttp-equiv="expires"content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="Thisismypage">
<!--
<linkrel="stylesheet"type="text/css"href="styles.css">
-->
</head>
<body>
<h1>文件上传</h1>
<formaction="${pageContext.request.contextPath}/upload"method="post"enctype="multipart/form-data">
<table>
<tr>
<td>上传用户名:</td>
<td><inputtype="text"name="username"/></td>
</tr>
<tr>
<td>上传文件:</td>
<td><inputtype="file"name="file"/></td>
</tr>
<tr>
<td>描述:</td>
<td><textarearows="5"cols="50"name="description"></textarea></td>
</tr>
<tr>
<td><inputtype="submit"value="上传开始"/></td>
</tr>
</table>
</form>
<div>${msg}</div>
<ahref="${pageContext.request.contextPath}/index.jsp">返回主页</a>
</body>
</html>
Servlet
importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
importcom.itheima.domain.Upfile;
importcom.itheima.exception.MyException;
importcom.itheima.service.UpfileService;
importcom.itheima.service.impl.UpfileServiceImpl;
importcom.itheima.untils.WebUntil;
publicclassUploadFileServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doPost(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//判断表单是不是多个部分组成的
if(!ServletFileUpload.isMultipartContent(request)){
request.setAttribute("msg","表单个设置错误,请检查enctype属性是是否设置正确");
request.getRequestDispatcher("/upload.jsp").forward(request,response);
return;
}
//是多部分组成的就获取并遍历返回一个文件上传对象,包含上传的所有信息
try{
Upfileupfile=WebUntil.upload(request);
UpfileServiceupfileService=newUpfileServiceImpl();
booleanflag=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(FileSizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("msg","单个文件大小,超过最大限制");
request.getRequestDispatcher("/upload.jsp").forward(request,response);
return;
}catch(SizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("msg","总文件大小,超过最大限制");
request.getRequestDispatcher("/upload.jsp").forward(request,response);
return;
}
}
}
工具类
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.io.UnsupportedEncodingException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.UUID;
importjavax.servlet.http.HttpServletRequest;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadBase;
importorg.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.ProgressListener;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
importcom.itheima.domain.Upfile;
importcom.itheima.exception.MyException;
/**
*文件上传工具类
*@DecriptionTODO
*
*/
publicclassWebUntil{
/**
*文件上传的方法
*@paramrequest请求参数传入
*@return返回一个Upfile对象
*@throwsFileSizeLimitExceededException
*@throwsSizeLimitExceededException
*@throwsIOException
*/
publicstaticUpfileupload(HttpServletRequestrequest)throwsFileSizeLimitExceededException,SizeLimitExceededException{
Upfileupfile=newUpfile();
ArrayList<String>fileList=initList();
try{
//获取磁盘文件对象工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
Stringtmp=request.getSession().getServletContext().getRealPath("/tmp");
System.out.println(tmp);
//初始化工厂
setFactory(factory,tmp);
//获取文件上传解析器
ServletFileUploadupload=newServletFileUpload(factory);
//初始化解析器
setUpload(upload);
//获取文件列表集合
List<FileItem>list=upload.parseRequest(request);
//遍历
for(FileItemitems:list){
//判断是不是普通表单个对象
if(items.isFormField()){
//获取上传表单的name
StringfieldName=items.getFieldName();
//value
StringfieldValue=items.getString("UTF-8");
//判断
if("username".equals(fieldName)){
//设置
upfile.setUsername(fieldValue);
}elseif("description".equals(fieldName)){
//设置属性
upfile.setDescription(fieldValue);
}
}else{
//是文件就准备上传
//获取文件名
Stringfilename=items.getName();
//处理因为浏览器不同而导致的获得的文件名的差异
intindex=filename.lastIndexOf("\\");
if(index!=-1){
filename=filename.substring(index+1);
}
//生成随机的文件名
Stringuuidname=generateFilename(filename);
//获取上传的文件路径
Stringsavepath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload");
//获取请求对象中的输入流
InputStreamin=items.getInputStream();
//将文件打散存放在不同的路径,求出路径
savepath=generateRandomDir(savepath,uuidname);
//复制文件
uploadFile(in,savepath,uuidname);
Stringid=UUID.randomUUID().toString();
upfile.setId(id);
upfile.setSavepath(savepath);
upfile.setUuidname(uuidname);
upfile.setFilename(filename);
//清除缓存
items.delete();
}
}
}catch(FileUploadBase.FileSizeLimitExceededExceptione){
//抛出出异常
throwe;
}catch(FileUploadBase.SizeLimitExceededExceptione){
//抛出出异常
throwe;
}catch(FileUploadExceptione){
e.printStackTrace();
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
returnupfile;
}
/**
*初始化文件列表
*@return
*/
privatestaticArrayList<String>initList(){
ArrayList<String>list=newArrayList<String>();
list.add(".jpg");
list.add(".rar");
list.add(".txt");
list.add(".png");
returnlist;
}
/**
*复制文件
*@paraminitems中的输入流
*@paramsavepath保存路径
*@paramuuidname文件名
*/
privatestaticvoiduploadFile(InputStreamin,Stringsavepath,
Stringuuidname){
//获取文件
Filefile=newFile(savepath,uuidname);
OutputStreamout=null;
try{
intlen=0;
byte[]buf=newbyte[1024];
//获取输出流
out=newFileOutputStream(file);
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
in.close();
}catch(IOExceptione){
e.printStackTrace();
}
try{
out.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
/**
*生成随机的存放路径
*@paramsavepath保存路径
*@paramuuidname生成的uuid名称
*@return
*使用hashcode完成
*/
privatestaticStringgenerateRandomDir(Stringsavepath,Stringuuidname){
//转化为hashcode
System.out.println("上传路径"+savepath);
System.out.println("UUIDNAME"+uuidname);
inthashcode=uuidname.hashCode();
//容器
StringBuildersb=newStringBuilder();
while(hashcode>0){
//与上15
inttmp=hashcode&0xf;
sb.append("/");
sb.append(tmp+"");
hashcode=hashcode>>4;
}
//拼接新的路径
Stringpath=savepath+sb.toString();
System.out.println("path"+path);
Filefile=newFile(path);
//判断路径存不存在
if(!file.exists()){
//不存在就创建
file.mkdirs();
}
//返回保存路径
returnpath;
}
/**
*生成新的文件名
*@paramuuidname随机的ID名字
*@paramfilename原来的名
*@return
*/
privatestaticStringgenerateFilename(Stringfilename){
Stringuuidname=UUID.randomUUID().toString();
returnuuidname.replace("-","").toString()+"_"+filename;
}
/**
*初始化解析器
*@paramupload
*/
privatestaticvoidsetUpload(ServletFileUploadupload){
//设置字符编码
upload.setHeaderEncoding("utf-8");
//设置文件大小
upload.setFileSizeMax(1024*1024*20);
//设置总文件大小
upload.setSizeMax(1024*1024*50);
//设置进度监听器
upload.setProgressListener(newProgressListener(){
publicvoidupdate(longpBytesRead,longpContentLength,intpItems){
System.out.println("已经读取:"+pBytesRead+",总共有:"+pContentLength+",第"+pItems+"个");
}
});
}
/**
*工厂初始化方法
*@paramfactory
*@paramtmp缓冲目录
*/
privatestaticvoidsetFactory(DiskFileItemFactoryfactory,Stringtmp){
///配置初始化值缓冲区
factory.setSizeThreshold(1024*1024);
Filefile=newFile(tmp);
//设置缓冲目录
factory.setRepository(file);
}
}
二文件下载
Servlet
publicclassDownupfileServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doPost(request,response);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取ID
Stringid=request.getParameter("id");
//业务层的接口
UpfileServiceupfileService=newUpfileServiceImpl();
//根据ID查找这个对象
Upfileupfile=upfileService.findUpfileById(id);
if(upfile==null){
return;
}
//获取文件的真实名称
Stringfilename=upfile.getFilename();
//如果文件名中有中文,需要转码,不然就下载时没有文件名
filename=URLEncoder.encode(filename,"utf-8");
//更改过的名称
Stringuuidname=upfile.getUuidname();
//保存路径
Stringsavepath=upfile.getSavepath();
Filefile=newFile(savepath,uuidname);
//判断文件是否存在
if(!file.exists()){
request.setAttribute("msg","下载的文件过期了");
request.getRequestDispatcher("/index").forward(request,response);
return;
}
//设置文件下载响应头信息
response.setHeader("Content-disposition","attachement;filename="+filename);
//使用IO流输出
InputStreamin=newFileInputStream(file);
ServletOutputStreamout=response.getOutputStream();
intlen=0;
byte[]buf=newbyte[1024];
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
in.close();
}
}
数据库
createdatabaseupload_download_exercise; useupload_download_exercise; createtableupfiles( idvarchar(100),//使用UUID生成 uuidnamevarchar(255),//uuid加上原来的文件名 filenamevarchar(100),//真实文件名 savepathvarchar(255),//保存路径 uploadtimetimestamp,//上传时间 descriptionvarchar(255),//描述 usernamevarchar(10)上传人 );
以上所述是小编给大家分享的JAVA使用commos-fileupload实现文件上传与下载的相关内容,希望对大家有所帮助。