hyy9512

导航

servlet利用Commons-FileUpload组件进行保存

1. 引入jar包:commons-fileupload-1.3.3.jar

      commons-io-2.5.jar

2. jsp页面布局

<body>
    <form action="upload" method="post" enctype="multipart/form-data">
    	文件:<input type="file" name="photo"/>
    	<input type="submit" value="提交"/>
    </form>
</body>

3.servlet中组件应用 

package hyy.test.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Fileupload extends HttpServlet {
	private static final long serialVersionUID = 1L;
	/*
	 * 临时保存的路径
	 */
	private String tempPath="WEB-INF/temp";
	/*
	 * 文件存储路径
	 */
	private String savePath="WEB-INF/upload";
	/*
	 * 上传文件的类型集合
	 */
	private List<String> fileType=Arrays.asList("jpg","gif","bmp","png","jpeg","ico");
	/*
	 * 项目的根路径
	 */
	private String servletPath=null;
	/*
	 * 完整请求最大准许的图片数
	 */
	private int sizeMax=3;
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		/*
		 * 解决乱码问题
		 */
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		/*
		 * 定义输出函数
		 */
		PrintWriter out=resp.getWriter();
		/*
		 * 判断提交的表单是否是multipart/form-data类型,利用ServletFileUpload.isMultipartContent(req)来验证
		 */
		Boolean isMultipart=ServletFileUpload.isMultipartContent(req);
		if(!isMultipart) {
			/*
			 * 如果不是,按照普通方法获取form表单的值:req.getParameter(name)
			 * 注意:表单一旦写成Multipart/form-data编码类型,req就得不到值,也就是值传递不成功,
			 *     如果用FileUpload获取表单值,又会特别麻烦,所以当表单不上传文件时,不要用Multipart/form-data
			 */
			return;
		} else {
			/*
			 * 是Multipart类型
			 */
			try {
				servletPath=getServletContext().getRealPath("/");
				/*
				 * 定义工厂函数
				 * ServletFileUpload类用于实现文件上传操作
				 * 设置工厂的缓冲区大小为1024K
				 * 超过缓冲区大小,将把文件存放在临时文件中
				 * 设置单个文件上传的最大值
				 * 设置请求消息实体内容的最大准许大小
				 * 设置浏览器上传给WEB服务器的各个表单字段的描述头内容的编码格式
				 */
				DiskFileItemFactory factory=new DiskFileItemFactory();
				ServletFileUpload upload=new ServletFileUpload(factory);
				factory.setSizeThreshold(1024*1024);
				factory.setRepository(generateFile(servletPath,tempPath));
				upload.setFileSizeMax(1024*1024);
				upload.setSizeMax(1024*1024*sizeMax);
				upload.setHeaderEncoding("utf-8");
				/*
				 * 从from表单取得FileItem集合
				 * 对集合进行遍历
				 * 判断表单项是否是文件域 item.isFormField()
				 *  一般表单:
				 *   1. 获取表单名称
				 *   2. 获取表单值
				 *   3. 对表单值进行操作
				 *  文件域:
				 *   1. 获取上传文件的文件名,判断文件域是否为空
				 *   2. 获取文件的扩展名,判断文件类型是否正确
				 *   3. 全都合格之后,对文件进行保存
				 *   	3.1 获取文件长度
				 */
				List<FileItem> items=upload.parseRequest(req);
				for(FileItem item:items) {
					if(item.isFormField()) {
						String name=item.getFieldName();
						String value=item.getString("utf-8");
						out.print(name+":"+value);
					} else {
						String fileName=item.getName().substring(item.getName().lastIndexOf("/")+1);
						if(fileName==null ||fileName.trim().equals("")) {
							out.print("<script>alert('文件不能为空!');window.location.href='upload.jsp';</script>");
						} 
						String type=item.getName().substring(item.getName().lastIndexOf(".")+1);
						if(fileType.contains(type)) {
							InputStream is=item.getInputStream();
							byte buffer[]=new byte[1024];
							String saveFileName=generateFileName(fileName);
							savePath=generateSavePath(servletPath+savePath,saveFileName);
							out.print("<script>alert(savePath);</script>");
							int len=0;
							FileOutputStream fos=new FileOutputStream(savePath+File.separator+saveFileName);
							while((len=is.read(buffer))>0) {
								fos.write(buffer,0,len);
							}
							is.close();
							fos.close();
							item.delete();
						} else {
							out.print("<script>alert('文件类型错误!');window.location.href='upload.jsp';</script>");
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
	}
	private String generateSavePath(String path, String fileName) {
		int hashcode=fileName.hashCode();
		int dir1=hashcode&15;
		int dir2=(hashcode>>4)&0xf;
		String savePath=path+File.separator+dir1+File.separator+dir2;
		File file=new File(savePath);
		if(!file.exists()) {
			file.mkdirs();
		} 
		return savePath;
	}
	private String generateFileName(String fileName) {
		return UUID.randomUUID().toString()+"_"+fileName;
	}
	private File generateFile(String servletPath, String tempPath) {
		if(!new File(servletPath+tempPath).isDirectory()) {
			new File(servletPath+savePath).mkdirs();
		}
		return new File(servletPath+savePath);
	}
}

 

posted on 2017-11-01 15:01  hyy9512  阅读(227)  评论(0)    收藏  举报