使用commos-fileupload实现文件上传与下载

一文件的上传

实体类


import java.sql.Timestamp;

/**
 * 
 * @Decription 文件上传实体类
 * @author 刘楠
 * 
 * @time2016-1-31上午11:17:46
 */
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
 * @author 刘楠
 *
 * @time2016-1-31下午12:56:02
 */
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) 上传人
);







  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FileUpload获取表单中参数的方法并对该组件做了进一点封装,使其更容易使用,并支持单文件上传和多文件上传两种方式,首先定义一个基类放置公共属性: FileUploadBase.java import java.io.File; import java.util.HashMap; import java.util.Map; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public abstract class FileUploadBase { protected Map<String, String> parameters = new HashMap<String, String>();// 保存普通form表单域 protected String encoding = "utf-8"; // 字符编码,当读取上传表单的各部分时会用到该encoding protected UploadFileFilter filter = null; // 文件过滤器, 默认为NULL 不过滤 /** * 设置内存中缓存大小。 */ protected int sizeThreshold = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD; /** * The maximum size permitted for the complete request, as opposed to *{@link #fileSizeMax}. A value of -1 indicates no maximum.* */ protected long sizeMax = -1; /** * 在sizeThreshold超出缓存区时临时保存的文件目录 */ protected File repository; public String getParameter(String key) { return parameters.get(key); } public String getEncoding() { return encoding; } public void setEncoding(String encoding) { this.encoding = encoding; } /** * 获取上传文件最大的大小,单位为Byte(字节),为-1时表示无限制 * @return */ public long getSizeMax() { return sizeMax; } /** * 设置上传文件最大的大小,单位为Byte(字节),为-1时表示无限制 * @param sizeMax */ public void setSizeMax(long sizeMax) { this.sizeMax = sizeMax; } public int getSizeThreshold() { return sizeThreshold; } public void setSizeThreshold(int sizeThreshold) { this.sizeThreshold = sizeThreshold; } /** * Returns the directory used to temporarily store files that are larger * than the configured size threshold. * * @return The directory in which temporary files will be located. * * @see #setRepository(java.io.File) * */ public File getRepository() { return repository; } /** * Sets the directory used to temporarily store files that are larger than * the configured size threshold. * * @param repository * The directory in which temporary files will be located. * * @see #getRepository() * */ public void setRepository(File repository) { this.repository = repository; } /** * 获取参数列表 * @return */ public Map<String, String> getParameters() { return parameters; } /** * 获取过滤器 * @return */ public UploadFileFilter getFilter() { return filter; } /** * 设置文件过滤器,不符合过滤器规则的将不被上传 * @param filter */ public void setFilter(UploadFileFilter filter) { this.filter = filter; } /** * 验证文件是否有效 * @param item * @return */ protected boolean isValidFile(FileItem item){ return item == null || item.getName() == "" || item.getSize() == 0 || (filter != null && !filter.accept(item.getName())) ? false : true; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值