当前位置: 移动技术网 > IT编程>开发语言>Java > JAVA使用commos-fileupload实现文件上传与下载实例解析

JAVA使用commos-fileupload实现文件上传与下载实例解析

2019年07月22日  | 移动技术网IT编程  | 我要评论

首先给大家介绍一文件的上传

实体类

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", "表单个设置错误,请检查enctype属性是是否设置正确"); 
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 请求参数传入 
* @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)){ 
//设置 
upfile.setusername(fieldvalue); 
}else if("description".equals(fieldname)){ 
//设置属性 
upfile.setdescription(fieldvalue); 
} 
}else{ 
//是文件就准备上传 
//获取文件名 
string filename=items.getname(); 
//处理因为浏览器不同而导致的 获得 的 文件名的 差异 
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); 
//复制文件 
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; 
} 
/** 
* 复制文件 
* @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) { 
//转化为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()){ 
//不存在就创建 
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) { 
// 设置 字符编码 
upload.setheaderencoding("utf-8"); 
//设置文件大小 
upload.setfilesizemax(1024*1024*20); 
//设置总文件大小 
upload.setsizemax(1024*1024*50); 
//设置进度监听器 
upload.setprogresslistener(new progresslistener() { 
public void update(long pbytesread, long pcontentlength, int pitems) { 
system.out.println("已经读取: "+pbytesread+",总共有: "+pcontentlength+", 第"+pitems+"个"); 
} 
}); 
} 
/** 
* 工厂初始化方法 
* @param factory 
* @param tmp 缓冲目录 
*/ 
private static void setfactory(diskfileitemfactory factory, string tmp) { 
/// 配置初始化值缓冲区 
factory.setsizethreshold(1024*1024); 
file file=new file(tmp); 
//设置缓冲目录 
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"); 
//业务层的接口 
upfileservice upfileservice=new upfileserviceimpl(); 
//根据id查找这个对象 
upfile upfile=upfileservice.findupfilebyid(id); 
if(upfile==null){ 
return; 
} 
//获取文件的真实名称 
string filename=upfile.getfilename(); 
//如果文件名中有中文,需要转码,不然就下载时没有文件名 
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; 
} 
//设置文件下载响应头信息 
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(); 
} 
}

数据库

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实现文件上传与下载的相关内容,希望对大家有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网