1 FileItem类的常用方法 2 1. boolean isFormField() 3 isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段, 4 还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。 5 因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。 6 2. String getName() 7 getName方法用于获得文件上传字段中的文件名。 8 注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中 9 只是文件名。 10 3. String getFieldName() 11 getFieldName方法用于返回表单标签name属性的值。例如<input type="text" 12 name="column" />的value。 13 4. void write(File file) 14 write方法用于将FileItem对象中保存的主体内容保存到某个指定的文件中。 15 如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后, 16 临时文件有可能会被清除。 17 该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的 18 文件内容保存在本地文件系统中 19 5. String getString() 20 1)getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回, 21 它有两个重载的定义形式: 22 2)public java.lang.String getString() 23 3)public java.lang.String getString(java.lang.String encoding) 24 throws java.io.UnsupportedEncodingException 25 4)前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的 26 字符集编码将主体内容转换成字符串。 27 如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个 28 getString方法,并为之传递正确的字符集编码名称。 29 6. String getContentType() 30 getContentType 方法用于获得上传文件的类型,即表单字段元素描述头 31 属性“Content-Type”的值, 32 如“image/jpeg”。如果FileItem类对象对应的是普通表单字段, 33 该方法将返回null。 34 7. boolean isInMemory() 35 isInMemory方法用来判断FileItem对象封装的数据内容是存储在内存中, 36 还是存储在临时文件中, 37 如果存储在内存中则返回true,否则返回false。 38 8. void delete() 39 1)delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被 40 保存在临时文件中,delete方法将删除该临时文件。 41 2)尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时 42 调用delete方法可以更早的清除临时文件, 43 释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件 44 被永久保存在了硬盘中。 45 9. InputStream getInputStream() 46 以流的形式返回上传文件的数据内容。 47 10. long getSize() 48 返回该上传文件的大小(以字节为单位)。
图片上传工具类
1 public static void save(HttpServletRequest req, HttpServletResponse resp) { 2 3 //保存图片的路径 4 String savePath = CommanPath.SAVE_PATH.getValue(); 5 //图片前面的具体路径 6 String imgPath = CommanPath.IMG_PATH.getValue(); 7 //new一个file类 8 File file = new File(savePath, imgPath); 9 //判断文件夹是否存在,如果存在,是否是文件夹,否则创建文件夹 10 if (!file.exists() && !file.isDirectory()) { 11 file.mkdirs(); 12 } 13 14 try { 15 //创建DiskFileItemFactory工厂 16 DiskFileItemFactory factory = new DiskFileItemFactory(); 17 //创建一个文件上传解析器 18 ServletFileUpload upload = new ServletFileUpload(factory); 19 //设置编码格式 20 upload.setHeaderEncoding("UTF-8"); 21 //判断提交的数据是否是表单上的数据,multpart/form-data,如果不是,返回空字符串 22 if (!ServletFileUpload.isMultipartContent(req)) { 23 24 } 25 //使用ServletFileUpload解析表单数据,返回的是List<FileItem>集合,需要进行遍历 26 //将上传的数据强制转换为FileItem类型 27 List<FileItem> list = upload.parseRequest(req); 28 for (FileItem item : list) { 29 //判断表单是否是普通类型,text,select等都是普通类型,否则该表单是file类型 30 if (item.isFormField()) { 31 String name = item.getFieldName(); 32 String value = item.getString("UTF-8"); 33 req.setAttribute(name,new String(value.getBytes())); 34 } else { 35 //得到当前图片文件name名 36 String filesName = item.getFieldName(); 37 //得到file文件名 38 String fileName = item.getName(); 39 //判断文件名是否为空 40 if (fileName == null || "".equals(fileName.trim())) { 41 continue; 42 } 43 //substring截取字符串,如果上传的文件名前面有\\,最后一个\\后面的文件名 44 fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); 45 46 //InputStream getInputStream(),以流的形式返回上传文件的数据内容。 47 InputStream inputStream = item.getInputStream(); 48 49 //保存到数据库的路径 50 String dataPath = imgPath + fileName; 51 //图片的具体路径(全路径) 52 String imgUrl = savePath + dataPath; 53 54 req.setAttribute(filesName,dataPath); 55 //文件输出流 56 FileOutputStream fileOutputStream = new FileOutputStream(imgUrl); 57 //创建一个为1M的缓冲区 58 byte buffer[] = new byte[1024]; 59 60 int length = 0; 61 //判断流是否已经读取完毕 62 while ((length = inputStream.read(buffer)) > 0) { 63 fileOutputStream.write(buffer, 0, length); 64 } 65 //关闭输入输出流,并删除临时文件 66 inputStream.close(); 67 fileOutputStream.close(); 68 item.delete(); 69 } 70 } 71 //判断当前用户是否登录 72 String token = (String) req.getAttribute("token"); 73 if (token==null){ 74 resp.getWriter().println(401); 75 }else { 76 //从redis中获取token是否与当前用户token一致 77 Jedis jedis = new Jedis(); 78 jedis.auth(CommanPath.REDIS_AUTH.getValue()); 79 String username = jedis.get(token); 80 if (username==null){ 81 resp.getWriter().println(401); 82 } 83 } 84 } catch (Exception e) { 85 e.printStackTrace(); 86 } 87 88 }