servlet文件上传

jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/uploadServlet" method="post"> 
<input type="text" name="name"/>
<input type="file" name="photo"/><br>
<input type="file" name="photo1"/><br>
<input type="submit" value="上传">

</form>
</body>
</html>

UploadServlet

package com.bj.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
					
		boolean b = ServletFileUpload.isMultipartContent(request);
		System.out.println(b);
		if(!b){
			
			throw new RuntimeException("不是多部分上传表单");	// 抛异常后不会向下进行了
		}
		//1.创建一个工厂 类
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//2.核心对象
		ServletFileUpload sfu=new ServletFileUpload(factory);	
		
		//6.设置文件临时文件位置(上传文件过大会产生临时文件)		(在上传结束清楚临时文件)
		//factory.setRepository(new File("D:/javaweb20181108"));
		
		//7.处理文件上传的表单乱码问题
		sfu.setHeaderEncoding("utf-8");
		
				
		//3.解析request得到的一个表单项集合
		try {
		//5.限制文件上传大小
			//sfu.setFileSizeMax(1024*1024*5);		//单个文件大小
			//sfu.setSizeMax(1024*1024*10);  			//总文件大小
			
			List<FileItem> list=sfu.parseRequest(request);		//泛型文件项目
			
			//遍历集合
			for(FileItem fileItem :list){
				if(fileItem.isFormField()){		//判断是否普通表单
					//普通表单解析 方法	
					processFromFileld(fileItem);
				}else{
					//上传表单解析方法		上传表单除了是文件的input    其他也会走普通表单方法
					processUpload(fileItem);
				}
			}			
		}catch (FileUploadBase.FileSizeLimitExceededException e){
			throw new RuntimeException("上传文件过大 ,充会员吧"); 
		
		}catch (FileUploadBase.SizeLimitExceededException e){
			throw new RuntimeException("上传总文件超过10M ,充会员吧"); 
			
		}catch (FileUploadException e) {
			e.printStackTrace();
		}		
	}
	
	
	

	
		//上传表单解析方法
	private void processUpload(FileItem fileItem) {
		//得到上传名称
		String filename=fileItem.getName();			//得到文件项目的名字     1.jpg   不同浏览器访问的名称路径不同
		//得到文件输入流
		try {
			InputStream is = fileItem.getInputStream();
//1.通过输出流将上传的文件携带服务器或指定位置(外网访问问题)
			String directoryrealPath = this.getServletContext().getRealPath("WEB-INF/upload");	 //保存到磁盘路径    	--保存到了服务器中
																	//WEB-INF/upload	存到web-inf中外部浏览器不能访问
			//创建一个存储目录 
			File storeDirectory = new File(directoryrealPath);
			if(!storeDirectory.exists()){
				storeDirectory.mkdirs();	//不存在创建一个目录
			}
//2.解决浏览器获取文件路径的问题							//截取文件名	File.separator文件名分割符
			//filename.substring(filename.lastIndexOf(File.separator)+1);
			if(filename!=null){
				filename=FilenameUtils.getName(filename);	//io.FilenameUtils中封装了一个截取文件名的方法
			}
//3.解决同名问题  
			filename=UUID.randomUUID()+"_"+filename;
			
//4.按照日期上传文件名
			//String ChildDirectory = makChildDirectory(storeDirectory);//创建一个方法  ,添加日期目录

//优化打乱名称
			String ChildDirectory = makChildDirectory(storeDirectory,filename);
			
			//创建一个完整路径							//WEB-INF/upload/日期/1.jpg	File.separator(文件分割符)	
			/*File file = new File(storeDirectory,ChildDirectory+File.separator+filename);		//目录和文件名     /upload/1.jpg
			//创建文件
			FileOutputStream fos = new FileOutputStream(file);
			int len=0;
			byte by[]=new byte[1024];
			while((len=is.read(by))!=-1){
				fos.write(by,0,len);
			}
			fos.close();
			is.close();*/
	//简化上传代码
			fileItem.write(new File(storeDirectory,ChildDirectory+File.separator+filename));
			
	//上传结束    清楚临时文件
			//fileItem.delete();
		} catch (IOException e) {			
			e.printStackTrace(); 
		} catch (Exception e) {
			
			e.printStackTrace();
		}
	}
//	优化打散名称
private String makChildDirectory(File storeDirectory, String filename) {
			int hashcode = filename.hashCode();	//返回String转换成的32位的hashcode吗
			String code = Integer.toHexString(hashcode);//转换成16进制的数
			String childDirectory=code.charAt(0)+File.separator+code.charAt(1);//取第一个值  第二个值创建文件夹
			File file=new File(storeDirectory,childDirectory);		//WEB-INF/upload/?/?
			if(!file.exists()){
				file.mkdirs();    
			}
			return childDirectory;
		}

//按照日期处理同名文件问题     目录
		private String makChildDirectory(File storeDirectory) {
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		String datedirectory = sdf.format(new Date());			//new date  当前时间的毫秒值
		//创建目录
		File file=new File(storeDirectory,datedirectory);     //WEB-INF/upload/2018...
		if(!file.exists()){
			file.mkdirs();    //mkdir单层目录     mkdirs多层目录
		}
		return datedirectory;				//返回日期目录
	}

		
		
	//普通表单方法 
	private void processFromFileld(FileItem fileItem) {
		//7.处理文件上传表单的乱码问题

		try {
			String filedname  = fileItem.getFieldName();		//获取input  name=""
			String filedvalue = fileItem.getString();			//获取值
			filedvalue=new String(filedvalue.getBytes("iso-8859-1"),"utf-8");
			System.out.println(filedname+":"+filedvalue);
			
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
		}
	}



	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值