今天做了一个文件上传功能。以前有过多次文件上传经验结果这次确确实实把我难住了。
本次上传借助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);
}
}
小弟文笔不过关,小小问题借用了大篇幅或许各位大虾们也没看明白。我的理解就是如果借用第三方包进行文件上传,尽量不要去手动指定编码格式,在不同环境下可能编码格式不一样会出现乱码。直接用获取请求过来的编码格式要好一些。欢迎大家指出其中的不足。
分享到:
相关推荐
3. **Apache Commons Fileupload**:该库提供了处理`multipart/form-data`数据的能力,可以解析接收到的请求,分离出文件和普通参数。它支持多文件上传、大文件上传,以及处理每个部分的数据。 4. **Apache Commons...
Apache Commons FileUpload是Apache Commons项目的一部分,它专注于处理HTTP协议中的multipart/form-data数据,这是浏览器在提交包含文件的表单时使用的格式。通过使用FileUpload,开发者可以轻松地从请求中解析出...
### 使用commons-fileupload-1.0进行文件上传的实例及乱码处理 #### 一、commons-fileupload简介 `commons-fileupload`是Apache Commons项目下的一个子项目,它提供了强大的文件上传功能,允许用户轻松地将文件从...
它是Apache Commons项目的一部分,旨在简化在Web应用程序中处理multipart/form-data请求的过程,这种请求类型通常用于上传文件。与之配套使用的Apache Commons IO库提供了许多IO操作的实用工具类。 **Apache ...
首先,Apache Commons FileUpload是一个专门处理HTTP多部分请求(multipart/form-data)的Java库,常用于文件上传。在上述例子中,我们看到了使用Commons FileUpload实现文件上传的步骤: 1. 创建上传页面:HTML...
在`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. 设置 ...
- 用户在Web表单中选择文件后,浏览器会将文件内容以多部分/形式数据(Multipart/form-data)格式封装在HTTP请求中。 - `common-fileupload`库解析这种复杂的HTTP请求,将文件内容分离出来,以便服务器端可以处理...
总之,Apache Commons FileUpload提供了一套完整的文件上传解决方案,通过处理HTTP请求中的多部分数据,解决了文件上传的诸多问题,包括文件的读取、保存以及乱码处理等。结合前端的HTML表单,开发者可以轻松实现...
Servlet_fileupload是Java Servlet中处理文件上传的一种常见方式,它基于Apache的Commons FileUpload库。这个库提供了处理HTTP请求中的多部分数据(通常用于文件上传)的功能。在本篇文章中,我们将深入探讨如何利用...
- `defaultEncoding`:指定编码方式,默认为UTF-8,用于解决文件名乱码问题。 - `maxUploadSize`:设置文件上传的最大限制,单位为字节。此处设置为20MB。 2. **异常处理**:为了避免因文件过大而导致的异常中断...
在HTTP协议中,文件上传通常通过表单提交实现,使用`enctype="multipart/form-data"`属性来指定表单数据类型。在Struts框架中,这可以通过Struts的`<s:file>`标签来创建上传文件的输入元素。 当用户选择文件并提交...
它提供了处理多部分请求(Multipart/form-data)的能力,是Java开发者处理文件上传的常用工具。标签中的"commons-fileupload"表明这个项目依赖于这个库,可以方便地处理文件上传的各种细节。 3. **中文支持**:在上...
4. **上传文件时的乱码**:使用`enctype="multipart/form-data"`的表单提交文件时,需要在Servlet中解析MultipartFile对象时指定正确的编码,例如使用Apache Commons FileUpload库。 5. **Eclipse和MyEclipse中的...
而对于multipart/form-data提交的文件,需要在Servlet或Filter中处理,例如使用Apache Commons FileUpload库,并指定字符集。 总的来说,解决Web项目中的中文乱码问题,关键是确保编码的一致性,并利用适当的编程...
enctype="multipart/form-data"> <input type="file" size="30" name="file01" /> <br /> <input type="file" size="30" name="file02" /> <br /> 上传" /> </form> </body> FileUploadServlet.java ...
本篇文章将详细探讨如何在Struts中处理文件上传并解决乱码问题。 首先,我们需要了解Struts文件上传的基本原理。在Struts中,文件上传是通过`Commons FileUpload`库来实现的,它是Apache Commons项目的一部分,专门...
- 文件上传时的乱码(enctype="multipart/form-data")通常需要自定义解析器来处理,因为Servlet API本身不支持设置请求编码。可以使用第三方库如Apache Commons FileUpload或Spring MVC的MultipartFile来处理文件...
在本文中,我们将深入探讨如何在Java服务器页面(JSP)中实现文件上传功能,并解决可能出现的乱码问题。文件上传是Web应用中常见的需求,它允许用户将本地文件发送到服务器进行处理或存储。在JSP中,我们通常会使用...