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

本文介绍在JavaWeb项目中,如何解决含有文件上传的表单提交时普通文本信息出现乱码的问题。通过使用multipart/form-data类型提交,并在后台处理时将普通文本信息转换为UTF-8编码,确保数据正确读取。

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();
					}

 

`Content-Type: multipart/form-data;` 是 HTTP 请求头的一部分,用于指示发送的数据类型为多部分数据(multipart),通常用于上传文件处理表单数据。当你遇到请求头中的中文字符显示乱码时,这可能是因为编码设置不正确导致的。 **中文乱码问题的原因**: 1. 编码问题:HTTP头部默认使用的是ASCII或ISO-8859-1等字符集,这些字符集中没有包含中文字符,所以中文直接写入可能会变成乱码。 2. 浏览器或服务器的字符集设置:如果发送方或接收方的字符集配置不匹配,也可能造成乱码。 3. Content-Type 中的 charset 没有指定正确的编码,如 UTF-8 或 GBK,需要确保其与实际使用的编码一致。 **解决方案**: 1. **设置正确的Content-Type**: 在`Content-Type`后面添加 `charset=utf-8` 或者对应的中文字符集,如 `charset=GBK`。例如: ```http Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW; charset=utf-8 ``` 2. **后端解析**: 如果是服务器端接收请求,确保解析器能够识别并正确解码传来的中文数据。例如,在Node.js中,可以使用`qs`库解析URLencoded查询字符串`multer`解析multipart/form-data。 3. **前端设置**: 对于浏览器,可以在发送请求前设置好Content-Type的编码,如果是JavaScript,可以使用fetch API的headers属性: ```javascript const headers = new Headers(); headers.append('Content-Type', 'multipart/form-data; boundary=...; charset=utf-8'); fetch(url, { method: 'POST', headers }); ``` **相关问题--:** 1. 如何在JavaScript中设置HTTP请求头的Content-Type? 2. 什么是HTTP头部的charset参数的作用? 3. 如果服务器端使用的是Java或PHP,如何正确解析带有中文的multipart/form-data请求?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值