- 文件上传的要求
- form表单属性enctype=“multipart/form-data”
- 后台使用 HttpServletRequest的getInputStream()方法可以得到撒谎那个村的数据信息,但是需要自行解析流…比较麻烦。而Apache Commons FileUpload工具包对此操作进行了相应的封装,可以直接拿来使用
- Apache Commons FileUpload使用步骤
- 创建磁盘文件项工厂对象 DiskFileItemFactory
- 创建一个ServletFileUpload
- 解析request
- 然后保存文件
以下是一个极简的案例:
- 页面 upload.jsp
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="desc"><br>
<input type="file" name="file"><br>
<input type="submit">
</form>
- 简单的后台代码
@WebServlet("/upload")
public class FileServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 创建一个ServletFileUpload
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
// 解析request
try {
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
// 是否为表单输入项
String name = fileItem.getFieldName();
String value = fileItem.getString();
System.out.println("name:" name "----value:" value);
}else{
// 文件
// 拿到upload目录代表的File对象
File uploadedFile = new File(getServletContext().getRealPath("/upload"));
// 目录不存在则先创建一下
if (!uploadedFile.exists()) {
uploadedFile.mkdirs();
}
// 创建一个用来保存文件的File对象:在upload目录下使用原始文件名保存
// 比如上传的是 a.txt 则保存到 upload目录也是 a.txt(也可以取随机名,自行根据业务操作即可)
File file = new File(uploadedFile, fileItem.getName());
// 写入文件
fileItem.write(file);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
其实Apache Commons FileUpload工具包还是有些复杂,步骤较多,有一些其他框架比如struts、springmvc都对其进行了封装,可以简化开发步骤。有兴趣的话可以自行查阅官网资料进行学习。