关于表单中文件的上传

前提:

要通过表单完成文件的上传,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);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值