准备:
文件上传需要准备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只对上传的文件名有效,其他元素无效,不同于默认的POSTrequest.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);//设置每个上传文件的最大为2Mupload.setFileSizeMax(1024*1024*2);//设置总上传量为10Mupload.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();}}