多文件上传心得
以我的“单文件上传为前提”,来讲述多文件上传。在此之前,可以先看一下我的上一篇博客。
1.首先先要在表单元素file上添加属性如下:multiple
<input type="file" name="pics" multiple/>
2.上传文件时,可以选择多个文件,处理方式与单文件上传相似,只不过是下面这段代码要运行多次(即上传了几张图片就执行几次,所以不需要担心多张图片是否能被保存)
String nameP = item.getFieldName();
String value = item.getName();
//获取到myshop项目的根目录
String path = getServletContext().getRealPath("/")+"upload\\";
//获取后缀名
String suffix = value.substring(value.lastIndexOf("."));
//生成一个图片的名称
String fileName = UUID.randomUUID().toString();
String newFileName = path+fileName+suffix;
sb.append("upload/"+fileName+suffix+",");
// pic_list.add("upload/"+fileName+suffix);
File file = new File(newFileName);
item.write(file);
3.处理多个图片路径,并保存到数据库
这个可能是大家最困惑的问题,我简单说一下思路,就是我们可以将单张图片的正确路径拼接成一个用特定分割符(我用的是逗号)分割的字符串,然后再保存到数据库。
StringBuilder sb = new StringBuilder();
sb.append("upload/"+fileName+suffix+",");
pro_map.put(nameP,sb.toString());//是一个map
4.处理从数据库查到多图片路径
思路:将这个字符串按特定分割符转化为一个字符数组,如调用split(",")方法,(这里我们还可以用Arrays.asList()方法将数组转换为List)。然后在相应的实体中加上一个List属性,用来存放处理后的结果。
然后将重新处理的结果重新封装并进行相应。
//在Product实体类中增加一个List属性。
for (Product product : p_list) {
String pics = product.getPics();
String[] ps = pics.split(",");
List<String> l = Arrays.asList(ps);
product.setList(l);
prop_list.add(product);
}
注意不要在原来的List对象或者是实体类对象上进行再次添加或赋值操作,这样处理后实体类对应的List属性依旧是null。
要重新创建一个新的对象进行再次封装。