java文件上传下载功能实现代码
本文实例为大家分享了文件上传下载java实现代码,供大家参考,具体内容如下
前台:
1.提交方式:post
2.表单中有文件上传的表单项:<inputtype=”file”/>
3.指定表单类型:
默认类型:enctype="application/x-www-form-urlencoded"
文件上传类型:multipart/form-data
FileUpload
文件上传功能开发中比较常用,apache也提供了文件上传组件!
FileUpload组件:
1.下载源码
2.项目中引入jar文件
commons-fileupload-1.2.1.jar【文件上传组件核心jar包】
commons-io-1.4.jar【封装了对文件处理的相关工具类】
使用:
publicclassUploadServletextendsHttpServlet{
//upload目录,保存上传的资源
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
/*********文件上传组件:处理文件上传************/
try{
//1.文件上传工厂
FileItemFactoryfactory=newDiskFileItemFactory();
//2.创建文件上传核心工具类
ServletFileUploadupload=newServletFileUpload(factory);
//一、设置单个文件允许的最大的大小:30M
upload.setFileSizeMax(30*1024*1024);
//二、设置文件上传表单允许的总大小:80M
upload.setSizeMax(80*1024*1024);
//三、设置上传表单文件名的编码
//相当于:request.setCharacterEncoding("UTF-8");
upload.setHeaderEncoding("UTF-8");
//3.判断:当前表单是否为文件上传表单
if(upload.isMultipartContent(request)){
//4.把请求数据转换为一个个FileItem对象,再用集合封装
List<FileItem>list=upload.parseRequest(request);
//遍历:得到每一个上传的数据
for(FileItemitem:list){
//判断:普通文本数据
if(item.isFormField()){
//普通文本数据
StringfieldName=item.getFieldName();//表单元素名称
Stringcontent=item.getString();//表单元素名称,对应的数据
//item.getString("UTF-8");指定编码
System.out.println(fieldName+""+content);
}
//上传文件(文件流)---->上传到upload目录下
else{
//普通文本数据
StringfieldName=item.getFieldName();//表单元素名称
Stringname=item.getName();//文件名
Stringcontent=item.getString();//表单元素名称,对应的数据
Stringtype=item.getContentType();//文件类型
InputStreamin=item.getInputStream();//上传文件流
/*
*四、文件名重名
*对于不同用户readme.txt文件,不希望覆盖!
*后台处理:给用户添加一个唯一标记!
*/
//a.随机生成一个唯一标记
Stringid=UUID.randomUUID().toString();
//b.与文件名拼接
name=id+"#"+name;
//获取上传基路径
Stringpath=getServletContext().getRealPath("/upload");
//创建目标文件
Filefile=newFile(path,name);
//工具类,文件上传
item.write(file);
item.delete();//删除系统产生的临时文件
System.out.println();
}
}
}
else{
System.out.println("当前表单不是文件上传表单,处理失败!");
}
}catch(Exceptione){
e.printStackTrace();
}
}
//手动实现过程
privatevoidupload(HttpServletRequestrequest)throwsIOException,
UnsupportedEncodingException{
/*
request.getParameter("");//GET/POST
request.getQueryString();//获取GET提交的数据
request.getInputStream();//获取post提交的数据*/
/***********手动获取文件上传表单数据************/
//1.获取表单数据流
InputStreamin=request.getInputStream();
//2.转换流
InputStreamReaderinStream=newInputStreamReader(in,"UTF-8");
//3.缓冲流
BufferedReaderreader=newBufferedReader(inStream);
//输出数据
Stringstr=null;
while((str=reader.readLine())!=null){
System.out.println(str);
}
//关闭
reader.close();
inStream.close();
in.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doGet(request,response);
}
}
案例:
Index.jsp
<body>
<ahref="${pageContext.request.contextPath}/upload.jsp">文件上传</a>
<ahref="${pageContext.request.contextPath}/fileServlet?method=downList">文件下载</a>
</body>
Upload.jsp
<body>
<formname="frm_test"action="${pageContext.request.contextPath}/fileServlet?method=upload"method="post"enctype="multipart/form-data">
<%--<inputtype="hidden"name="method"value="upload">--%>
用户名:<inputtype="text"name="userName"><br/>
文件:<inputtype="file"name="file_img"><br/>
<inputtype="submit"value="提交">
</form>
</body>
FileServlet.java
/**
*处理文件上传与下载
*@authorJie.Yuan
*
*/
publicclassFileServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取请求参数:区分不同的操作类型
Stringmethod=request.getParameter("method");
if("upload".equals(method)){
//上传
upload(request,response);
}
elseif("downList".equals(method)){
//进入下载列表
downList(request,response);
}
elseif("down".equals(method)){
//下载
down(request,response);
}
}
/**
*1.上传
*/
privatevoidupload(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
try{
//1.创建工厂对象
FileItemFactoryfactory=newDiskFileItemFactory();
//2.文件上传核心工具类
ServletFileUploadupload=newServletFileUpload(factory);
//设置大小限制参数
upload.setFileSizeMax(10*1024*1024);//单个文件大小限制
upload.setSizeMax(50*1024*1024);//总文件大小限制
upload.setHeaderEncoding("UTF-8");//对中文文件编码处理
//判断
if(upload.isMultipartContent(request)){
//3.把请求数据转换为list集合
List<FileItem>list=upload.parseRequest(request);
//遍历
for(FileItemitem:list){
//判断:普通文本数据
if(item.isFormField()){
//获取名称
Stringname=item.getFieldName();
//获取值
Stringvalue=item.getString();
System.out.println(value);
}
//文件表单项
else{
/********文件上传***********/
//a.获取文件名称
Stringname=item.getName();
//----处理上传文件名重名问题----
//a1.先得到唯一标记
Stringid=UUID.randomUUID().toString();
//a2.拼接文件名
name=id+"#"+name;
//b.得到上传目录
StringbasePath=getServletContext().getRealPath("/upload");
//c.创建要上传的文件对象
Filefile=newFile(basePath,name);
//d.上传
item.write(file);
item.delete();//删除组件运行时产生的临时文件
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*2.进入下载列表
*/
privatevoiddownList(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示
//1.初始化map集合Map<包含唯一标记的文件名,简短文件名>;
Map<String,String>fileNames=newHashMap<String,String>();
//2.获取上传目录,及其下所有的文件的文件名
StringbathPath=getServletContext().getRealPath("/upload");
//目录
Filefile=newFile(bathPath);
//目录下,所有文件名
Stringlist[]=file.list();
//遍历,封装
if(list!=null&&list.length>0){
for(inti=0;i<list.length;i++){
//全名
StringfileName=list[i];
//短名
StringshortName=fileName.substring(fileName.lastIndexOf("#")+1);
//封装
fileNames.put(fileName,shortName);
}
}
//3.保存到request域
request.setAttribute("fileNames",fileNames);
//4.转发
request.getRequestDispatcher("/downlist.jsp").forward(request,response);
}
/**
*3.处理下载
*/
privatevoiddown(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取用户下载的文件名称(url地址后追加数据,get)
StringfileName=request.getParameter("fileName");
fileName=newString(fileName.getBytes("ISO8859-1"),"UTF-8");
//先获取上传目录路径
StringbasePath=getServletContext().getRealPath("/upload");
//获取一个文件流
InputStreamin=newFileInputStream(newFile(basePath,fileName));
//如果文件名是中文,需要进行url编码
fileName=URLEncoder.encode(fileName,"UTF-8");
//设置下载的响应头
response.setHeader("content-disposition","attachment;fileName="+fileName);
//获取response字节流
OutputStreamout=response.getOutputStream();
byte[]b=newbyte[1024];
intlen=-1;
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
//关闭
out.close();
in.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doGet(request,response);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。