前提:
要通过表单完成文件的上传,Form表单要添加一个重要的属性如下:
<form id="addProductForm" method="post" style="padding-top: 20px;" enctype="multipart/form-data">
注意:enctype中的属性有三种:
(1)application/x-www-form-urlencoded:默认对字符进行编码处理。
(2)multipart/form-data:不对字符进行编码,文件上传必须使用该属性。
(3)text/plain:对字符不进行编码处理。
接下来要注意:
文件上传时:使用getParamter()方法不可用,因为数据提交的格式变了,是通过流的方式进行的提交,并且提交的格式是相同的,
可以自己通过抓包工具,进行抓取,然后自己通过流的操作进行解析,不过这里第三方已经封装好了,可以直接使用(这里上网上搜索文件
上传的jar包下载即可)。
思路解析:
要完成文件的上传,首先要明白文件上传到哪了?是怎么上传的?
文件的上传其实就是文件的复制,就是将通过Form表单提交的文件,复制到服务器中部署的具体项目路径下(如:
D:\javaweb\tomcat\apache-tomcat-7.0.77\webapps\MyShopAdmin\products),这里products是我项目下的存储商品图片的文件夹,
将文件复制到Tomcat(服务器这里以Tomcat为例)后,数据库中就可以通过路径访问,但注意,这里只是将图片上传到了服务器,
自己eclipse的项目下的图片文件夹中并没有。
步骤分析:
A.导入jar包
B.编写代码实现
固定语法:
//创建一个工厂类。
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建一个解析对象。
ServletFileUpload fileUpload fileUpload = new ServletFileUpload(factory);
//解析request,返回的是list集合,解析时会将上传的数据的每一部分封装成FileItem对象,存入list集合。
List<FileItem> fis = fileUpload.parseRequest(request);
C.解析fileItem
for(FileItem fi : fis){
syso( fi );重写了toString,有fileItem的具体信息。
}
D.对FileItem进行分类
if( fi.isFormFiled ){//一般表单数据
fi.getFiledName();//获取键
fi.getString();//获取值,注意需要处理乱码
}else{ //文件上传项
fi.getFiledName();//获取键
fi.getName();//获取文件名
然后对数据进行读写
}
代码实现(以图片上传为例):
//创建Product的对象 Product product=new Product(); //创建一个map集合 HashMap map=new HashMap<>(); //创建一个工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); //创建一个解析对象 ServletFileUpload fileUpload = new ServletFileUpload(factory); //解析request,返回的是list集合,解析时会将上传的数据的每一部分封装成FileItem对象,存入list集合。 List<FileItem> fis = fileUpload.parseRequest(request); for (FileItem fi : fis){ //如果是普通的form提交 if(fi.isFormField()){ //获取键值对 String key=fi.getFieldName(); String value = fi.getString(); //注意编码格式,这里直接处理了(可查看本人前几篇,有关请求乱码的精确处理) value = new String(value.getBytes("ISO-8859-1"),"UTF-8"); //将非文件的form提交的数据先保存到map集合中 map.put(key, value); }else{ //图片处理 String key = fi.getFieldName(); //文件的名字 String name = fi.getName();//没有乱码 //创建输入流对象 InputStream inputStream = fi.getInputStream(); //获取到这个存储的文件夹的路径,会随着服务器的改变而动态的改变 ServletContext sc = request.getServletContext(); //该products是项目中存储图片的文件夹 String productsPath = sc.getRealPath("/products"); //目录优化 String dir = UploadUtils.getDir(); //拼接文件夹 如:D:\javaweb\tomcat\apache-tomcat-7.0.77\webapps\MyShopAdmin\products\dir File file = new File(productsPath+dir); if(!file.exists()){ file.mkdirs(); } //文件名优化 String fileName = UUIDUtils.getUUID(); //后缀名获取 int lastIndexOf = name.lastIndexOf("."); String houZhui = name.substring(lastIndexOf); fileName+=houZhui; //根据存储路径以及文件名创建文件 File file2=new File(file,fileName); if(!file2.exists()){ file2.createNewFile(); } //创建输出流 FileOutputStream out=new FileOutputStream(file2); //inputStream的数据写到out里 IOUtils.copy(inputStream, out); IOUtils.closeQuietly(out); IOUtils.closeQuietly(inputStream); //数据库存储文件路径//图片路径(存入数据库中的文件路径) String imgPath="products"+dir+"/"+fileName; map.put(key, imgPath); } } //将map集合中的数据组织成JavaBean,这里我使用了自己封装的工具类,读者可以自己通过遍历map集合,将值写入JavaBean中 MyBeanUtils.getObject(product, map);