现在的位置: 首页 > 综合 > 正文

commons-fileupload实现文件上传,可以选择多文件

2018年09月29日 ⁄ 综合 ⁄ 共 7270字 ⁄ 字号 评论关闭

文件上传下载:

 

package cn.zc.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
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 UploadServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	
	public UploadServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("UploadServlet1");
		//判断表格的提交方式是否是multipart/form-data类型
		if(!ServletFileUpload.isMultipartContent(request)){
			//如果不是该类型,采用普通方式处理。
			//response.setContentType("text/html;charset=utf-8");
			//PrintWriter out = response.getWriter();
			//request.getParameter("user");//此时便可以使用request.getParameter方法
			//为了方便在此直接退出
			System.out.println("不是文件上传处理");
			return ;
		}
		
		System.out.println("UploadServlet21");
		//创建一个解析工厂
		DiskFileItemFactory factory=new DiskFileItemFactory();
		//设置阀值,大于此值时创建临时文件
		factory.setSizeThreshold(1024*1024*10);
		System.out.println("UploadServlet22");
		//设置临时缓存文件的保存目录
		factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
		System.out.println("UploadServlet23");
		//得到解析器对象
		ServletFileUpload upload=new ServletFileUpload(factory);
		//设置文件上传的大小10M
		upload.setFileSizeMax(1024*1024*100);
		System.out.println("UploadServlet24");
		//设置保存文件的编码方式,
		upload.setHeaderEncoding("UTF-8");
		try{
			
			//定义规定上传文件的类型
			String[]arr={".jpg",".zip",".txt",".ppt",".pptx",".doc",".docx",".xls",".gif"};
			//将类型放到List中
			List fileStandType=Arrays.asList(arr);
			System.out.println("UploadServlet25");
			List items = new ArrayList();
			items = upload.parseRequest(request);
			//对请求进行解析,有几个输入项就会有几个FileItem对象
			System.out.println("UploadServlet3");
			
			Iterator it = items.iterator();

			while(it.hasNext()){
				FileItem item = (FileItem)it.next();
				System.out.println("UploadServlet4");
				//判断输入元素的类型,
				if(item.isFormField()){//是普通项
					System.out.println("UploadServlet5");
					//得到name属性
					String inputName=item.getFieldName();
					//得到相对应的值
					String inputValue=item.getString("UTF-8");//可指定字符编码,以防乱码
					System.out.println("inputName: "+inputName+" : "+"inutValue: "+inputValue);
				}else{//是上传文件输入项
					//获取上传文件名称
					System.out.println("UploadServlet6");
					String fileName=item.getName();
					//判断fileName是否为空即是否真的选择了上传文件,不为空继续
					if(!fileName.trim().equals("")){
						System.out.println("UploadServlet7");
						//对文件名进行处理得到文件名
						fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
						System.out.println("fileName: "+ fileName);
						//得到文件后缀判断文件类型
						String fileType=fileName.substring(fileName.lastIndexOf("."));
						System.out.println("fileType: "+fileType);
						//判断是否是制定的文件类型,暂时未用到
						if(!fileStandType.contains(fileType)){
							//如果不是制定类型的文件跳转页面,
							System.out.println("文件类型不匹配");
							request.setAttribute("fileTypeError","只能上传指定类型的文件,jpg/zip/txt/ppt/pptx/docx/doc/xls/gif");
							request.getRequestDispatcher("/handler.jsp").forward(request, response);
							return ;
						}
						//文件已选择,得到输入流
						InputStream in=item.getInputStream();
						//将上传的文件保存在服务器受保护的WEB-INF的目录下,
						String savePath=this.getServletContext().getRealPath("WEB-INF/upload");
						savePath=getFilePath(savePath,fileName);
						//同名文件覆盖问题对fileName进行进一步处理,工具类UUID
						fileName=UUID.randomUUID().toString()+"_"+fileName;
						//构建输出流
						FileOutputStream fos=new FileOutputStream(savePath+"\\"+fileName);
						byte[] buffer=new byte[1024];
						//int len=0;
						while(in.read(buffer)>0){
							fos.write(buffer);
							fos.flush();
						}
						in.close();
						fos.close();
						request.setAttribute("finish","上传成功!");
						item.delete();//在关闭流之后,删除临时缓存文件
					}
				}
			}
			
		}catch(Exception e){
			request.setAttribute("finish","上传失败!");
		}
		request.getRequestDispatcher("/handler.jsp").forward(request, response);
	}
	
	//方法对文件保存目录进行处理,
	public String getFilePath(String path,String fileName){
		//产生目录结构的算法:hash目录
		int dir1=fileName.hashCode()&0x0f;//一级目录
		int dir2=fileName.hashCode()>>4 &0x0f;//二级目录
		String savePath=path+"\\"+dir1+"\\"+"\\"+dir2;
		File file=new File(savePath);
		if(!file.exists()){
			file.mkdirs();
		}
		return savePath;
	}
	
	
	public void init() throws ServletException {
		// Put your code here
	}

}

 

<%@ 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>文件上传</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">

	<script type="text/javascript">
		function addElement() {
		//得到隐藏input里面的value值
		var index = document.getElementById("hidden").getAttribute("value");
			if(index>4){
				alert("最大同时上传4个文件");
				return false;
			}

		//创建一个input类型的节点
		var inputElement = document.createElement("input");
		//设置新创建的节点的属性,类型为file,name值递增
		inputElement.setAttribute("type", "file");
		inputElement.setAttribute("name", "file" + index);

		//创建文本节点
		var fontElement = document.createTextNode("选择文件:");
		//将创建的文本节点添加到div中
		document.getElementById("upload_div").appendChild(fontElement);

		//将创建的input类型的节点添加到div中
		document.getElementById("upload_div").appendChild(inputElement);
		//创建一个换行
		var brElement = document.createElement("br");
		//添加到div中
		document.getElementById("upload_div").appendChild(brElement);
		//将隐藏input里面的value值加1
		document.getElementById("hidden").setAttribute("value",parseInt(index) + 1);
	}

	function deleteElement() {
		//因为add方法添加了3个节点循环三次
		for ( var i = 0; i < 3; i++) {
			//删除最后一个节点
			document.getElementById("upload_div").removeChild(document.getElementById("upload_div").lastChild);
		}
		//将隐藏input里面的value值设为1
		document.getElementById("hidden").setAttribute("value",1);
	}
	</script>

	</head>

	<body>
		<form
			action="${pageContext.request.contextPath}/servlet/UploadServlet"
			method="post" enctype="multipart/form-data">
			<input type="hidden" name="hidden" value="file" id="fileload">
			用户:
			<input type="text" name="user" id="txtinput" >
			   
			<input type="button" value="上传文件" onclick="addElement()">
			   
			<input type="button" value="删除" onclick="deleteElement()">
			<div id="upload_div" style="width: 300px;">
			</div>
			<input type="submit" value="提交">
		</form>

	</body>
</html>

 

<%@ 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 'handler.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>
	<%=request.getAttribute("fileTypeError") %>
	
	
	<%=request.getAttribute("finish") %>
  </body>
</html>

1、这里要注意设定上传文件的大小,设置太小了文件上传下面的方法转化的request的值为空。

ServletFileUpload.parseRequest(request);

2、注意上传页面的form表单属性enctype="multipart/form-data"

抱歉!评论已关闭.