`
mutou_tool
  • 浏览: 13652 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

阅读更多
今天做了一个文件上传功能。以前有过多次文件上传经验结果这次确确实实把我难住了。
本次上传借助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);
			}
		}

小弟文笔不过关,小小问题借用了大篇幅或许各位大虾们也没看明白。我的理解就是如果借用第三方包进行文件上传,尽量不要去手动指定编码格式,在不同环境下可能编码格式不一样会出现乱码。直接用获取请求过来的编码格式要好一些。欢迎大家指出其中的不足。
2
1
分享到:
评论
2 楼 timer_yin 2012-05-15  
我的代码在windows环境下以及linux、solaris都没有问题,但是部署到客户aix环境下,上传中文文件,文件名就乱码,aix机器环境可以手动创建中文名文件及文件夹说明aix环境是支持中文的,问题还是在代码上,我的项目使用的是GBK编码,过滤器也用了GBK,但是aix环境是UTF8的,所以我设置fileUpload.setHeaderEncoding("UTF-8"),windows环境下就乱码了,不知道怎么改了
1 楼 hekuilove 2011-12-25  
楼主说的好啊,我ding啊。。 

相关推荐

    上传文件fileupload+解决enctype= multipart/form-data无法传递其他参数

    3. **Apache Commons Fileupload**:该库提供了处理`multipart/form-data`数据的能力,可以解析接收到的请求,分离出文件和普通参数。它支持多文件上传、大文件上传,以及处理每个部分的数据。 4. **Apache Commons...

    commons-fileupload-1.4 jar包.rar

    Apache Commons FileUpload是Apache Commons项目的一部分,它专注于处理HTTP协议中的multipart/form-data数据,这是浏览器在提交包含文件的表单时使用的格式。通过使用FileUpload,开发者可以轻松地从请求中解析出...

    commons-fileupload-1.0上传组件使用实例.

    ### 使用commons-fileupload-1.0进行文件上传的实例及乱码处理 #### 一、commons-fileupload简介 `commons-fileupload`是Apache Commons项目下的一个子项目,它提供了强大的文件上传功能,允许用户轻松地将文件从...

    commons-fileupload-1.2.2+commons-io-2.4+源码+帮助文档

    它是Apache Commons项目的一部分,旨在简化在Web应用程序中处理multipart/form-data请求的过程,这种请求类型通常用于上传文件。与之配套使用的Apache Commons IO库提供了许多IO操作的实用工具类。 **Apache ...

    commons-fileupload和smartupload实现文件上传

    首先,Apache Commons FileUpload是一个专门处理HTTP多部分请求(multipart/form-data)的Java库,常用于文件上传。在上述例子中,我们看到了使用Commons FileUpload实现文件上传的步骤: 1. 创建上传页面:HTML...

    commons-fileupload组件上传问题

    在`demo.jsp`中,我们需要创建一个HTML表单,包含`enctype="multipart/form-data"`属性,这样才能支持文件上传。在`upload.jsp`中,我们需要使用`commons-fileupload`来解析请求,获取上传的文件。 在`upload.jsp`...

    解决中文乱码的几种解决方法(推荐)

    1. 前台jsp中,我使用的是 form post 请求,设置了 enctype=”multipart/form-data” ,页面编码格式都是utf-8 2. 后台中,我使用的是commons-fileUpload组件,ServletFileUpload 解析form表单和文件, 3. 设置 ...

    common-fileupload文件上传及下载

    - 用户在Web表单中选择文件后,浏览器会将文件内容以多部分/形式数据(Multipart/form-data)格式封装在HTTP请求中。 - `common-fileupload`库解析这种复杂的HTTP请求,将文件内容分离出来,以便服务器端可以处理...

    commons fileupload实现文件上传的实例代码

    总之,Apache Commons FileUpload提供了一套完整的文件上传解决方案,通过处理HTTP请求中的多部分数据,解决了文件上传的诸多问题,包括文件的读取、保存以及乱码处理等。结合前端的HTML表单,开发者可以轻松实现...

    Serlvet_fileupload文件上传功能,导入直接使用

    Servlet_fileupload是Java Servlet中处理文件上传的一种常见方式,它基于Apache的Commons FileUpload库。这个库提供了处理HTTP请求中的多部分数据(通常用于文件上传)的功能。在本篇文章中,我们将深入探讨如何利用...

    Java实训教程 Java软件开发实战 Java开发框架介绍 SpringMVC_9_文件上传 共9页.pptx

    - `defaultEncoding`:指定编码方式,默认为UTF-8,用于解决文件名乱码问题。 - `maxUploadSize`:设置文件上传的最大限制,单位为字节。此处设置为20MB。 2. **异常处理**:为了避免因文件过大而导致的异常中断...

    struts上传(已解决中文问题)

    在HTTP协议中,文件上传通常通过表单提交实现,使用`enctype="multipart/form-data"`属性来指定表单数据类型。在Struts框架中,这可以通过Struts的`&lt;s:file&gt;`标签来创建上传文件的输入元素。 当用户选择文件并提交...

    fileupload 文件上传

    它提供了处理多部分请求(Multipart/form-data)的能力,是Java开发者处理文件上传的常用工具。标签中的"commons-fileupload"表明这个项目依赖于这个库,可以方便地处理文件上传的各种细节。 3. **中文支持**:在上...

    JSP中文乱码问题综述,中文乱码解决大全

    4. **上传文件时的乱码**:使用`enctype="multipart/form-data"`的表单提交文件时,需要在Servlet中解析MultipartFile对象时指定正确的编码,例如使用Apache Commons FileUpload库。 5. **Eclipse和MyEclipse中的...

    web项目乱码问题 jsp乱码问题解决

    而对于multipart/form-data提交的文件,需要在Servlet或Filter中处理,例如使用Apache Commons FileUpload库,并指定字符集。 总的来说,解决Web项目中的中文乱码问题,关键是确保编码的一致性,并利用适当的编程...

    Jsp文件上传下载(工具类源码)

    enctype="multipart/form-data"&gt; &lt;input type="file" size="30" name="file01" /&gt; &lt;br /&gt; &lt;input type="file" size="30" name="file02" /&gt; &lt;br /&gt; 上传" /&gt; &lt;/form&gt; &lt;/body&gt; FileUploadServlet.java ...

    Struts上传,已经处理好乱码问题

    本篇文章将详细探讨如何在Struts中处理文件上传并解决乱码问题。 首先,我们需要了解Struts文件上传的基本原理。在Struts中,文件上传是通过`Commons FileUpload`库来实现的,它是Apache Commons项目的一部分,专门...

    JSP中文乱码解决集锦

    - 文件上传时的乱码(enctype="multipart/form-data")通常需要自定义解析器来处理,因为Servlet API本身不支持设置请求编码。可以使用第三方库如Apache Commons FileUpload或Spring MVC的MultipartFile来处理文件...

    jsp文件上传实例以及配置详细讲解

    在本文中,我们将深入探讨如何在Java服务器页面(JSP)中实现文件上传功能,并解决可能出现的乱码问题。文件上传是Web应用中常见的需求,它允许用户将本地文件发送到服务器进行处理或存储。在JSP中,我们通常会使用...

Global site tag (gtag.js) - Google Analytics