使用Apache commons-fileupload实现文件上传
文件上传功能在很多的web项目中都会使用到,JavaEE的框架中也可以很方便地实现文件上传。下面举一个简单的例子,演示在Servlet中的文件上传功能。
首先创建一个Servlet类,继承自HttpServlet:
package com.demo.upload;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
/**
* 文件上传功能Servlet
*
* @author 小明
*/
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
// ……
}
@WebServet注解是Servlet3.0的特性,如果使用的Servlet2.5,则还是需要配置web.xml。
重写doGet()方法,当客户端浏览器发起GET请求时,显示上传文件界面:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().append("<html>").append("<head><title>上传文件</title></head>").append("<body>")
.append("<form action='upload' method='post' enctype='multipart/form-data'>")
.append("选择上传文件:<input type='file' name='file_upload' /><br/>")
.append("选择上传文件:<input type='file' name='file_upload' /><br/>")
.append("用户:<input type='text' name='user' /><br/>").append("<input type='submit' value='上传' />")
.append("</form>").append("</body>").append("</html>");
}
要上传文件,表单的提交方式应为POST提交,同时,将enctype属性值必为multipart/form-data。
重写doPost方法,表单提交时,调用该方法处理上传:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024 * 1024); // 设置单个文件最大上传大小
String username = "";
try {
// 解析request中的FileItem
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (!fileItem.isFormField()) { // 文件
// 保存的目标文件位置
String dest = request.getServletContext().getRealPath("\\upload") // upload文件夹
+ File.separator // 分隔符
+ fileItem.getName(); // 文件名
// 将文件写入服务器路径中
fileItem.write(new File(dest));
System.out.println("成功");
} else {
String fieldName = fileItem.getFieldName();
if ("user".equals(fieldName)) {
username = fileItem.getString();
}
}
}
response.getWriter().append(username + "文件上传成功");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
将该Servlet部署到web容器中,访问/upload获取上传文件的界面,选择上传文件,填写用户信息,点击上传按钮,即可将文件上传到服务器端upload文件夹中保存。