天天看点

基于Servlet3.0+注解开发实现文件上传

文件上传:

   * 要求:

        1.表单的提交方式必须是POST

        2.表单中必须有<input type="file" name="upload"/>标签,而且该标签必须有name属性.

        3.表单的enctype属性的值,必须为:"multipart/form-data",表单所提交的Servlet上有@MultipartConfig注解表示:     该Servlet处理的是multipart/form-data类型的请求

index.jsp(web界面)

<%@ 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>
<h1>文件上传的页面</h1>
<!-- 
	* 表单的提交的方式必须是POST.
	* 表单中需要有文件上传的表单元素:这个元素这个元素必须有name属性和值:<input type=”file” name=”upload”>
	* 表单的enctype属性的值必须是multipart/form-data.
 -->
<form action="${ pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
	<table  width="600">
		<tr>
			<td>文件描述</td>
			<td><input type="text" name="desc"></td>
		</tr>
		<tr>
			<td>文件上传</td>
			<td><input type="file" name="upload"></td>
		</tr>
		<tr>
			<td colspan="2"><input type="submit" value="上传"></td>
		</tr>
	</table>
</form>
</body>
</html>
           

UUIDUtils.java

package com.upload.demo;

import java.util.UUID;

/**
 * 生成随机字符串工具类(通用唯一识别码)
 * 
 * @author 侯青华
 *
 */
public class UUIDUtils {
	// 私有构造
	private UUIDUtils() {
	}

	// 返回一个识别码
	public static String getUUID() {
		return UUID.randomUUID().toString().replace("-", ""); // 去掉字符串的"-"
	}

	// 返回一个识别码+"_"+文件名的新文件名(防止上传文件名重复问题) 例:dasda_aaa.txt
	public static String getUUIDFileName(String fileName) {
		return getUUID() + "_" + fileName;
	}

}
           

UploadUtils.java

package com.upload.demo;

/**
 * 获得文件存储目录(根据hashCode计算+位运算生成二级目录)
 * 
 * @author 侯青华
 *
 */
public class UploadUtils {
	public static String getPath(String uuidFileName) {
		// 使用UUIDUtils生成的唯一文件名.hashCode();
		int code1 = uuidFileName.hashCode();
		int d1 = code1 & 0xf; // 获得到1级目录.
		int code2 = code1 >>> 4;
		int d2 = code2 & 0xf; // 获得到2级目录.
		return "/" + d1 + "/" + d2; //返回获得的目录

	}

}
           

UploadServlet.java(文件上传的Servlet)

package com.upload.demo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

/**
 * 上传文件Servlet
 * 
 * @author 侯青华
 * @version 创建时间:2018年3月22日 下午7:40:10
 */
@WebServlet("/UploadServlet") // 设置访问这个Servlet的路径
@MultipartConfig // 说明该Servlet处理的是multipart/form-data类型的请求
public class UploadServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@SuppressWarnings("resource")
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 接收普通数据(解决post方式request中文乱码)
		request.setCharacterEncoding("utf-8");
		// 解决文件输出中文乱码
		response.setContentType("text/html;charset=utf-8");
		// 接收文件
		Part part = request.getPart("upload");
		// 获得文件名
		String header = part.getHeader("Content-Disposition");
		int indx = header.lastIndexOf("filename=\"");
		String fileName = header.substring(indx + 10, header.length() - 1);
		// 获得文件输入流(拿到文件)
		InputStream is = part.getInputStream();
		// 获得upload文件路径
		String path = this.getServletContext().getRealPath("/upload");
		// 调用UUIDUtils获得唯一文件名
		String uuidFileName = UUIDUtils.getUUIDFileName(fileName);
		// 调用UploadUtils获得路径(对文件进行分目录存放,防止一个目录中文件过多)
		String realPath = UploadUtils.getPath(uuidFileName);
		File file = new File(path + realPath);
		if (!file.exists()) {
			// 路径不存在则创建
			file.mkdirs();
		}
		// 输出流
		FileOutputStream fos = new FileOutputStream(path + realPath + "/" + uuidFileName);
		byte[] chs = new byte[1024];
		int len;
		while ((len = is.read(chs)) != -1) {
			fos.write(chs, 0, len);
		}
		// 释放资源
		is.close();
		fos.close();
		response.getWriter().println("文件上传成功!");
	}

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

         总结: 文件名可以通过获取当前系统时间毫秒值+文件名的方式. 目录名也可以创建时间目录(依据天/周/月均可).依照不同情况进行编码.

继续阅读