Web---Servlet---文件上传

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34928644/article/details/82356554

准备:

文件上传需要准备Apache提供的一个jar包:commons-fileupload-1.2.2.jar     最新的jar包地址

为了进行流拷贝方便我还使用另一个jar包:commons-io-2.1.jar  最新的jar包地址

前端页面:

注意:form必须是post方式,并且enctype="multipart/form-data"

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>文件上传</title>
  </head>
  
  <body>
    
   <form action="<%=request.getContextPath()%>/upload" method="post" enctype="multipart/form-data">
             文件:<input type="file" name="file"/> <br/>
          文件描述:<input type="text" name="desc"/> <br/>       
      <input type="submit" value="提交"/> 
   </form>
   <br/><br/>
   
   
   
  </body>
</html>

servlet


import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>相册浏览</TITLE></HEAD>");
		out.println("  <BODY>");
		
		out.println("对不起,不能直接通过路径上传文件...");
		
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//在multipart/form-data类型的POST方式提交时,
		//setCharacterEncoding只对上传的文件名有效,其他元素无效,不同于默认的POST
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>相册浏览</TITLE></HEAD>");
		out.println("  <BODY>");
		String msg = "";
		String contentType = request.getContentType();
		if ( !contentType.contains("multipart/form-data") ) {
			msg = "对不起,暂不支持这种上传方式...";
		}else {
			//ServletFileUpload需要的临时文件存放处理的工厂
			DiskFileItemFactory fiFactory = new DiskFileItemFactory();
			String tempFileDir = getServletContext().getRealPath("/temp");
			File tempDir = new File(tempFileDir);
			if(!tempDir.exists()) {
				tempDir.mkdirs();
			}
			//设置临时文件存放目录
			fiFactory.setRepository( tempDir );
			//文件上传入口
			ServletFileUpload upload = new ServletFileUpload(fiFactory);
			//设置每个上传文件的最大为2M
			upload.setFileSizeMax(1024*1024*2);
			//设置总上传量为10M
			upload.setSizeMax(1024*1024*10);
			
			try {
				@SuppressWarnings("unchecked")
				List<FileItem> files = upload.parseRequest(request);
				if( files != null ) {
					for (FileItem fileItem : files) {
						//判断是否时普通表单组件
						if( fileItem.isFormField() ) {
							//能到这里说明时普通表单组件
							String fieldName = fileItem.getFieldName();
							//普通表单组件必须在这里设置编码才有效
							String value = fileItem.getString("utf-8");
							System.out.println(fieldName+" :: "+value);
						}else {
							//能到这里说明时上传文件
							//获取文件名
							String fileName = fileItem.getName();
							if(fileName.length()<=0) {
								msg += "上传文件不能为空...";
								continue;
							}
							
							/* 考虑文件存放问题:
							 * 当一个文件夹存放文件超过10k个时,访问文件的速度将大大降低
							 * 最好的是一个目录存放1k个左右的文件
							 * 所以要进行打散目录,这里就分个二级目录,根据项目规模而定
							 */
							//还需注意存储是文件名不能用中文,所以需要用一个id作为文件名
							//然后把真正的文件名通过数据库存储。
							//生成uuid的文件名
							String UUName = UUID.randomUUID().toString().replaceAll("-", "");
							//带扩展名的真实文件
							String realName = UUName+fileName.substring( fileName.lastIndexOf('.') );
							//生成1级目录
							String dir1 = Integer.toHexString(UUName.hashCode() & 0xf);
							//生成2级目录
							String dir2 = Integer.toHexString((UUName.hashCode()>>4) & 0xf);
							//组装真正文件存放目录
							String realDir = getServletContext().getRealPath("/")+"/upload/"+dir1+"/"+dir2;
							File dir = new File(realDir);
							//如果目录不存在就创建
							if ( !dir.exists() ) {
								dir.mkdirs();
							}
							
							File file = new File( dir, realName );
							System.out.println(file);
							//获取输入流
							InputStream in = fileItem.getInputStream();
							//进行流对拷,利用apache的工具包对拷
							FileUtils.copyInputStreamToFile(in, file);
							//关流
							in.close();
							msg = "文件上传成功!!!";
						}
					}
				}
			} catch (FileUploadException e) {
				e.printStackTrace();
				msg = "文件上传异常...";
			}
			
		}
		out.println(msg);
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_34928644/article/details/82356554