关于commons-fileupload解决(multipart/form-data)参数乱码问题_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于commons-fileupload解决(multipart/form-data)参数乱码问题

关于commons-fileupload解决(multipart/form-data)参数乱码问题

 2011/12/27 9:07:42  mutou_tool  http://mutou-tool.iteye.com  我要评论(0)
  • 摘要:今天做了一个文件上传功能。以前有过多次文件上传经验结果这次确确实实把我难住了。本次上传借助commons-fileupload-1.2.1.jar进行上传,本地测试文件上传成功,且并未出现乱码问题(测试过如果不含文件上传的表单能正常提交且正常显示),但发布到服务器上结果表单元素出现了中文乱码问题。代码如下:finalDiskFileItemFactorydiskFileItemFactory=newDiskFileItemFactory();diskFileItemFactory
  • 标签:file for 解决 问题 乱码问题
今天做了一个文件上传功能。以前有过多次文件上传经验结果这次确确实实把我难住了。
本次上传借助commons-fileupload-1.2.1.jar进行上传,本地测试文件上传成功,且并未出现乱码问题(测试过如果不含文件上传的表单能正常提交且正常显示),但发布到服务器上结果表单元素出现了中文乱码问题。
代码如下:
final DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
			diskFileItemFactory.setSizeThreshold(this.diskFileSize);
			{ // 采用系统临时文件目录作为上传的临时目录
				final File tempfile = new File(System.getProperty("java.io.tmpdir"));
				diskFileItemFactory.setRepository(tempfile);
			}
			final ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
			fileUpload.setSizeMax(1024 * 1024 * 4);//限制文件最大上传数量
			fileUpload.setHeaderEncoding("UTF-8");
			try {
				fileList = fileUpload.parseRequest(request);
			} catch (final FileUploadException e) {
				// 存在信息读取问题,返回错误信息
				e.printStackTrace();
				super.error.put("信息读取错误问题", "错误信息是:" + e.getMessage());
				return;
			}
		}
		// 进行
		String fieldName;
		this.map = new HashMap<String, Object>();
		for (final FileItem file : fileList) {
			if (file.isFormField()) {
				fieldName = file.getFieldName();
				try {
					map.put(fieldName, file.getString());
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} else {
				this.map.put(file.getFieldName(), file);
			}
		}

这样设置本机会通过,通常情况下不会报错。结果放在linux服务器上结果就出现了中文乱码。起初以为是linux编码格式问题,结果修改linux系统编码EN_US,zh_CN,zh_US试过很多编码格式都不正确,网上也找了很多资料,没解决。判断解决方法思路出错,转向表单提交方式。因为文件上传都会设置FORM表单的ENCTYPE="multipart/form-data"值。调试发现表单提交到后台的时候元素值就已经是乱码了。
参考了一些网上的解决方案:
http://www.360doc.com/content/07/0705/12/12224_595521.shtml
http://www.blogjava.net/duduli/archive/2008/11/11/239845.html等,综合这些牛人们的解决方案,在他们的基础上修改了一些编码,提交测试乱码问题解决。
解决代码如下:
final DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
			diskFileItemFactory.setSizeThreshold(this.diskFileSize);
			{ // 采用系统临时文件目录作为上传的临时目录
				final File tempfile = new File(System.getProperty("java.io.tmpdir"));
				diskFileItemFactory.setRepository(tempfile);
			}
			final ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
			fileUpload.setSizeMax(this.maxSize);
			fileUpload.setHeaderEncoding(request.getCharacterEncoding());
			try {
				fileList = fileUpload.parseRequest(request);
			} catch (final FileUploadException e) {
				// 存在信息读取问题,返回错误信息
				e.printStackTrace();
				super.error.put("信息读取错误问题", "错误信息是:" + e.getMessage());
				return;
			}
		}
		// 进行
		String fieldName;
		this.map = new HashMap<String, Object>();
		for (final FileItem file : fileList) {
			if (file.isFormField()) {
				fieldName = file.getFieldName();
				try {
					map.put(fieldName, file.getString(request.getCharacterEncoding()));
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} else {
				this.map.put(file.getFieldName(), file);
			}
		}

小弟文笔不过关,小小问题借用了大篇幅或许各位大虾们也没看明白。我的理解就是如果借用第三方包进行文件上传,尽量不要去手动指定编码格式,在不同环境下可能编码格式不一样会出现乱码。直接用获取请求过来的编码格式要好一些。欢迎大家指出其中的不足。
发表评论
用户名: 匿名