Java Web工程中multipart/form-data表单上传文件和普通文本信息乱码问题

Java Web工程中数次遇到的问题:在提交表单时,如果提交的表单既有文件(图片、文件、rar压缩包等),也有普通文本信息,表单的提交方式enctype="multipart/form-data",就会导致上传的普通文本信息乱码。

解决方案:

在获取Jsp页面传来的数据后,将Fileitem中的文件和普通文本信息分开处理。

处理后将文件先放置于临时存储空间;

对普通文本信息进行转码UTF-8,就是获取到item中的字符串内容,以utf8形式。

String value = item.getString("UTF-8");

 

部分代码如下

//处理表单信息,图片的上传
		//获得磁盘文件工厂
				DiskFileItemFactory factory = new DiskFileItemFactory();
				//获取上传路径
				String path = request.getRealPath("/upload");
				
				//先将文件放置于临时存储空间里
				//最终通过流的形式将文件写到瓷盘里
				factory.setRepository(new File(path));
				//设置文件大小
				factory.setSizeThreshold(1024*1024);
				
				//使用api进行文件上传处理
				ServletFileUpload upload = new ServletFileUpload(factory);
				
				//处理多文件上传
				OutputStream os = null;
				InputStream in = null;
				try {
					List<FileItem> list = upload.parseRequest(request);
					//遍历集合
					for (FileItem item : list) {
						//获取表单中的属性的名字
						String name = item.getFieldName();
						//判断是否为表单的普通文本信息
						if(item.isFormField()){
							//获取abc这样的字符串
							
							//问题:将普通文本信息和图片分开处理后,普通文本信息乱码
							//解决方案: 在此处getString方法中追加编码格式
							String value = item.getString("UTF-8");
							
							//存储
							request.setAttribute(name, value);
						}else{
							//处理非文本类型数据类似图片,pdf,rar等等
							//分三步走
							//1.获取路径名
							String value = item.getName();
							//d:\\test\\hehe.jgp
							//2.处理反斜杠
							int start = value.lastIndexOf("\\");
							//得到文件名,去除反斜杠前面的内容
							filename = value.substring(start+1);
							
							request.setAttribute(name, value);
							//3.准备写入
							//上传需要读写流
							os = new FileOutputStream(new File(path,filename));
							
							in = item.getInputStream();
							
							int length = 0;
							byte [] buf = new byte[1024];
							while((length=in.read(buf))!=-1){
								os.write(buf, 0, length);
							}
							
							in.close();
							os.close();
							
						}//for结尾
						
						
					}
					} catch (FileUploadException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值