JSP页面上传文件
通常来说,我们需要获得用户填写的数据时,会使用表单<form>这个标签。但是如果要上传的数据中包含了文件,对应的form设置就会不一样了。
<form action="/MVC_Test_Cook/FoodAddServlet" method="post" enctype="multipart/form-data"> </form>
如果我们使用request的一些方法就会很麻烦,所以apache给我们提供了一个很方便的方法
开始时,需要两个jar包commons-fileupload-1.2.1.jar和commons-io-1.4.jar,将这两个包导入后,可通过下列代码,完成一系列操作
1 // 1.创建一个磁盘文件项工厂对象 2 DiskFileItemFactory diskfileitemfactory = new DiskFileItemFactory(); 3 // 2.创建一个核心解析类(解析从浏览器发送的请求) 4 ServletFileUpload servletfileupload = new ServletFileUpload(diskfileitemfactory); 5 // 3.解析request请求,返回的是Lis t集合,在List集合 6 List<FileItem> list = servletfileupload.parseRequest(request); 7 // 4.遍历集合,判断是否是普通表单,还是文件上传项目 8 for (FileItem fileItem : list) { 9 if (fileItem.isFormField()) { 10 // 判断为普通表单,并接收值 11 String name = fileItem.getFieldName();// 获取表单项的name属性的值 12 String value = fileItem.getString("UTF-8");// 传入编码,并获取表单的值
。。。进行普通表单值的相应操作
}
1 else { 2 // 判断为文件项 3 // 文件上传功能: 4 // 获得文件上传的名称 5 6 String fileName = fileItem.getName(); 7 //判断用户是否选择了文件 8 if (!fileName.isEmpty() && !fileName.equals("")) { 9 // 通过工具类使文件名唯一 10 String uuidfileName = UploadUtils.getUUIDFileName(fileName); 11 // 获取文件存储的路径 12 String path = this.getServletContext().getRealPath("/upload"); 13 // 整合路径和文件名 14 url = path + "//" + uuidfileName; 15 // 获取文件的输入流 16 InputStream inputStream = fileItem.getInputStream(); 17 // 获取文件的输出流 18 OutputStream outputStream = new FileOutputStream(url); 19 20 // 将输入流中的数据写入到输出流 21 int len = 0; 22 byte[] ch = new byte[1024]; 23 while ((len = inputStream.read(ch)) != -1) { 24 outputStream.write(ch, 0, len); 25 } 26 inputStream.close(); 27 outputStream.close(); 28 } 29 }
通过该方法可完成form表单中的文件上传功能