总结:
实际应用: 1. 实现文件的上传功能
2. 使用相对路径来将文件写到磁盘中
3. 自动创建目录
原理: 先导入两个第三方的jar包,一个是commons-io这个jar包,一个是commons-fileupload这个jar包。
(已经封装好了),将一个表单提交到一个servlet,可以获得相应的文件file的名称,和 相应的参数。然后写进某一个盘符中。
细节: 1.一定要用post方式提交,并且要使用enctype="multipart/form-data",表示能够接受多种提交格式。
2 .接收参数的那个servlet不能用 request.getParameter("")来接收参数。
关键代码:
public class FileUpload extends HttpServlet {
private File file = null;
private File tempFile = null;
@Override
public void init() throws ServletException {
file = new File(this.getServletContext().getRealPath("upload"));
if(!file.exists()){
file.mkdir();
}
tempFile = new File(this.getServletContext().getRealPath("upload\\temp"));
if(!tempFile.exists()){
tempFile.mkdir();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
PrintWriter out = res.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(4096);
// 超过4096个字节的时候,就使用临时的文件夹来存储上传的文件
factory.setRepository(tempFile);
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum size before a FileUploadException will be thrown
upload.setSizeMax(1000000);
try {
List fileItems = upload.parseRequest(req);
Iterator iter = fileItems.iterator();
String itemNo="";
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
// 忽略其他不是文件域的所有表单信息
if(item.isFormField()){
if("itemNo".equals(item.getFieldName())){
itemNo = item.getString();
}
}
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if ((name == null || name.equals("")) && size == 0) {
continue;
}
name = name.substring(name.lastIndexOf("\\") + 1, name.length()); //
ItemsService.getInstance().modifyFileName(itemNo, name);
//String uploadPath = req.getSession().getServletContext().getRealPath("upload")+"\\";
//通过相对路径获得绝对路径
System.out.println("name====" + name);
System.out.println(file +"\\"+name);
item.write(new File(file +"\\"+name));
}
}
res.sendRedirect(req.getContextPath()+"/servlet/FindAllItemsServlet");
} catch (Exception e) {
e.printStackTrace();
}
}
}