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

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

实体类

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

(0)

相关推荐

  • Java组件commons fileupload实现文件上传功能

    Apache提供的commons-fileupload jar包实现文件上传确实很简单,最近要用Servlet/JSP做一个图片上传功能,在网上找了很多资料,大多是基于struts框架介绍的,还有些虽然也介绍common-fileupload的上传,但是那些例子比较老,有些类现在都废弃了. 通过研究学习总结,终于完成了这个上传功能,下面与大家分享一下. 案例场景 一个图书馆后台管理界面,需要提供上传图书图片的功能并且最终显示在页面中. 实现效果 进入添加书籍页面,默认显示一个图片"暂无突破&qu

  • java使用common-fileupload实现文件上传

    文件上传是网站非常常用的功能,直接使用Servlet获取上传文件还得解析请求参数,比较麻烦,所以一般选择采用apache的开源工具,common-fileupload.这个jar包可以再apache官网上面找到,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的. common-fileupload是依赖于common-io这个包的,所以还需要下载这个包.然后导入到你的项目路径下面. 使用代码如下 package oop.hg.ytu.servlet; impo

  • java组件commons-fileupload实现文件上传、下载、在线打开

    最近做了一个文件上传.下载.与在线打开文件的功能,刚开始对文件上传的界面中含有其它表单(例如输入框.密码等)在上传的过程中遇到了许多问题,下面我写了一个同时实现文件上传.下载.在线打开文件的测试程序. 首先请看效果图: 核心代码: package com.jefry; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URL; import java.u

  • java组件fileupload文件上传demo

    在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去. 如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些图片,文档上传到服务器上面去.然后其他用户可以去下载这些文件,那么这样的话,我们可以自己编程实现文件的上传,但是更好的方式是使用一些已有的组件帮助我们实现这种上传功能. 常用的上传组件: Apache 的 Commons FileUpload JavaZoom的UploadBean jspSmartUpload FileUpload下载地址: http:/

  • java组件commons-fileupload实现文件上传

    一.所需要的包: 1.commons-fileupload-1.2.1.jar: 下载地址 http://commons.apache.org/downloads/download_fileupload.cgi 2.commons-io-1.4.jar: 下载地址 http://commons.apache.org/downloads/download_io.cgi 二.注意事项: form表单里面要加上enctype="multipart/form-data" 三.代码示例  1.j

  • Java中使用fileupload组件实现文件上传功能的实例代码

    使用fileupload组件的原因: Request对象提供了一个getInputStream()方法,通过这个方法可以读取到客户端提交过来的数据,但是由于用户可能会同时上传多个文件,在servlet中编程解析这些上传数据是一件非常麻烦的工作.为方便开发人员处理文件上传数据,Apache开源组织提供了一个用来处理表单文件上传的一个开源组件(Commons-fileupload),该组件性能优异,并且使用及其简单,可以让开发人员轻松实现web文件上传功能. 使用Commons-fileupload

  • JavaEE组件commons-fileupload实现文件上传、下载

    一.文件上传概述 实现Web开发中的文件上传功能,需要两步操作: 1.在Web页面中添加上传输入项 <form action="#" method="post" enctype="multipart/form-data"> <input type="file" name="filename1"/><br> <input type="file" n

  • java组件commons-fileupload文件上传示例

    文件上传在Web应用中非常普遍,要在Java Web环境中实现文件上传功能非常容易,因为网上已经有许多用Java开发的组件用于文件上传,本文以使用最普遍的commons-fileupload组件为例,演示如何为Java Web应用添加文件上传功能. commons-fileupload组件是Apache的一个开源项目之一,可以从http://commons.apache.org/fileupload/下载.该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小. 下载后解压zip包,将c

  • Java进阶之FileUpload完成上传的实例

     Java进阶之FileUpload完成上传的实例 FileUpload是Apache commons下面的一个子项目,用来实现Java项目下的文件上传功能,常见的文件上传还有SmartUpload,Servlet3.0,Struts2. 在这里我用的是commons- fileupload-1.2.1,下面就是一个简单实例,解析过程都写到代码中的注释上了,注释很详细 //创建磁盘文件项工厂 DiskFileItemFactory diskFileItemFactory=new DiskFile

  • Java组件FileUpload上传文件实现代码

    一般在用Servlet处理表单元素时,表单元素都是一些简单的文本,Servlet很容易用Request.getParameter()就可以处理.但是当表单不止包含一些简单的文本,比如有上传文件域时,Servlet直接从HttpServletRequest对象中解析出复合表单的每一个子部分仍然是一项非常复杂的工作. 为了简化对"multipart/form-data"类型数据的处理过程,可以采用相应的组件进行处理,这样可以节省很大的编码.支持重用,效率也挺高. 对于Java的组件也有一些

随机推荐