通过commons-fileupload-1.2.1.jar组件上传文件,需要的以来包有Commons-io-1.4.jar。上传的表单如下:
<%@ 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 'index.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>
<form action="UploadServlet" enctype="multipart/form-data" method="post">
用户名:<input type="text" name="username"> <br />
<input type="file" name="upload">
<input type="submit" value="提交">
</form>
</body>
</html>
Serlvet1.0代码
package com.gdin.servlet;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
InputStream in = request.getInputStream();
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//upload.setHeaderEncoding("utf-8");//优先级高
try {
List<FileItem> fileItems = upload.parseRequest(request);
//是否为普通表单项
FileItem f1 = fileItems.get(0);
String value1 = f1.getString("utf-8");//普通项的值
System.out.println(f1.getFieldName()+"="+value1);
//文件项
FileItem f2 = fileItems.get(1);
System.out.println("content-type="+f2.getContentType());
System.out.println("size="+ f2.getSize());
File f = new File("E:\\", "baibing.jpg");
f2.write(f);//写入文件
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
文件上传的注意问题以及细节主要有:
1.提交的method必须为post。并且需要声明enctype="multipart/form-data"属性
2.文件必须保存到WEB-INF下,目的就是为了不让浏览器直接访问到
3.文件名相关问题
* 有的浏览器上传的文件名是绝对路径,这需要切割。
*有的文件名乱码或者普通表单项乱码:request.setCharacterEncoding("utf-8"),因为fileupload内部会调用request.setCharacterEncoding()。
*文件同名问题:需要我们为每个文件添加名称前缀,前缀不能重复,CommonUtils.uuid()
4.目录打散:一个目录不能存放过多的文件
5.上传的文件大小限制:单个文件大小限制,整个请求所有数据大小限制
6.缓存目录与临时目录
下面Servlet2.0:主要是演示通过哈希码的方式来目录打散
package com.gdin.servlet; import java.io.File; import java.io.IOException; import java.util.List; 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 cn.itcast.commons.CommonUtils; public class Upload2Servlet extends HttpServlet { /** * 目录方式有:文件名首字母,上传日期,哈希 * 演示哈希存储路径 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //上传的三个步骤 //创建工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //解析器 ServletFileUpload upload = new ServletFileUpload(factory); //获取到文件 try { List<FileItem> list = upload.parseRequest(request); FileItem f = list.get(1); //获取到路径 String path = this.getServletContext().getRealPath("/WEB-INF/files"); //获取到文件名 String fname = f.getName(); //处理路径的绝对路径问题 int index = fname.indexOf("\\"); if(index != -1){ fname = fname.substring(index+1); } //获得哈希值 int hcode = fname.hashCode(); //转为16进制 String hex = Integer.toHexString(hcode); //创建目录 File dir = new File(path, hex.charAt(0)+"/"+hex.charAt(1)); /* * 如果不存在目录就创建,存在就不创建 */ dir.mkdirs(); //保存的名字,防止同名覆盖 String savename = CommonUtils.uuid()+"_"+fname; //创建文件 File saveFile = new File(dir, savename); //保存 f.write(saveFile); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }