用servlet实现文件的上传,这里用到Apache的开源工具:common-fileupload。因为common-fileupload依赖于common-io,所以需要同时下载两个包。
common-fileupload下载链接
commonm-io下载链接
把两个包相应的jar文件拷贝到项目的lib文件夹下:
创建文件上传表单:(fileUpload.jsp)
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="username"><br>
<input type="file" name="file"><br>
<input type="submit" value="文件上传">
</form>
</body>
注意事项:
这里文件上传表单中的method和enctype的设置属性是固定的,只能为post和multipart/form-data
<form action="XXXServlet" method="post" enctype="multipart/form-data">
3.servlet代码编写
先建立一个upload文件夹
代码:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory dfi = new DiskFileItemFactory();
//获得上传文件的存储路径
String path = request.getRealPath("/upload");
//设置文件大小超过1024*1024就写到disk上
dfi.setSizeThreshold(1024*1024);
//设置存储的仓库
dfi.setRepository(new File(path));
//实例化一个servletFileUpload对象
ServletFileUpload sfu = new ServletFileUpload(dfi);
//解决上传文件乱码问题
sfu.setHeaderEncoding("utf-8");
try {
List<FileItem> list = sfu.parseRequest(request);
//取得session
HttpSession session = request.getSession();
//遍历得到每个FileItem
for(FileItem item : list){
//取得表单文本框的名字
String name = item.getFieldName();
//如果上传的这个文件只是一个表单字段,而不是一个文件
if(item.isFormField()){
//取得文本框输入的内容
String value = item.getString();
//存储数据
session.setAttribute(name, value);
}else{
//如果上传的是一个文件
//取得上传文件的名字,即上传框中的内容名字
String value = item.getName();
//因为在opera浏览器中文件上传item.geName()会得到具体路径而不止是名字,所以需要从路径中取出名字
//取得文件路径名字开始的位置
int start = value.lastIndexOf("\\");
//得到文件名
String fileName = value.substring(start+1);
//读取文件的内容
item.write(new File(path,fileName));
//存储数据
session.setAttribute(name, fileName);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//请求转发到另一个页面,在另一个页面取出上传文件的信息
request.getRequestDispatcher("fileInfo.jsp").forward(request, response);
}
注意问题:
在这里的servlet中不能用request.getParameter("字段名")
来获取表单的字段内容,因为表单的enctype="multipart/form-data"
,这里传输的是二进制,所以不能用`getParameter(“字段名”)获得。
获得字段名:
String name = item.getFieldName();
获得内容:(分两种情况)
- 文本框内容:
String value = item.getString();
//或者
String value = item.getString("指定编码encoding")
2.文件上传:
//取得上传文件的名字,即上传框中的内容名字
String value = item.getName();
//因为在opera浏览器中文件上传item.geName()会得到具体路径而不止是名字,所以需要从路径中取出名字
//取得文件路径名字开始的位置
int start = value.lastIndexOf("\\");
//得到文件名
String fileName = value.substring(start+1);
//读取文件的内容
item.write(new File(path,fileName));