在项目中一直使用struts的FormFile上传文件,后来发现这种方式存在一些缺陷:上传前后文件的大小不一致,主要取决于写入stream的时候byte数组大小的设置,
code="java"]
byte[] temp = new byte[BUFFER_SIZE];
BufferedInputStream bi = new BufferedInputStream(file.getInputStream(),BUFFER_SIZE);
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(tempPath));
while (bi.read(temp) != -1) {
bo.write(temp);
}[
如果数组大小设置为1024字节,则每次写入1024字节,但是,如果在最后一次写入的时候原始文件中的字节数不到1024,这是仍然写入1024字节,这就导致在上传文件前后,文件大小不一致的问题,为了解决这个问题采用了apache的commons.fileupload上传文件,此方式在上传前后文件大小一致,至于是如何write的需要进一步研究。具体方式如下:
1. 前台ext需要设置formPanel的fileUpload属性为true,如果前台用jsp需要设置表单form的enctype="multipart/form-data"属性。
2. formPanel用submit方式提交。
上传文件部分代码如下:
public static String upload (String dir, HttpServletRequest request) {
DiskFileUpload fu = new DiskFileUpload();
//最多上传3G的数据
fu.setSizeMax(1024 * 1024 * 1024 * 3);
//超过1M的字段数据采用临时文件缓存
fu.setSizeThreshold(1024 * 1024);
//采用默认的临时文件存储位置
//fu.setRepositoryPath(...);
//设置上传的普通字段的名称和文件字段的文件名所采用的字符集编码
fu.setHeaderEncoding("utf-8");
//得到所有表单字段对象的集合
List fileItems = null;
try {
fileItems = fu.parseRequest(request);
} catch (FileUploadException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
//处理每个表单字段
Iterator i = fileItems.iterator();
String targetName = null;//目标文件名
while (i.hasNext()){
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()){
try {
String pathSrc = fi.getName();//获取上传文件路径
pathSrc = new String(pathSrc.getBytes("ISO-8859-1"),"UTF-8");
if(pathSrc.trim().equals(""))
{
continue;
}
int start = pathSrc.lastIndexOf('\\');
String tempName = pathSrc.substring(start + 1);//获取上传文件名
String fileName = DateUtils.getNowLongTime();//新的文件名
if(tempName.indexOf(".") < 0){//如果文件没有后缀
targetName = fileName;
}else{
int index = tempName.lastIndexOf(".");
targetName = fileName+tempName.substring(index);//fileName+文件后缀
}
File pathDest = new File(dir, targetName);
fi.write(pathDest);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
fi.delete();
}
}
}
return targetName.replace("\\", "/");
}
需要注意事项:ext的Formpanel不需设置对应的ActionForm,否则fileItems = fu.parseRequest(request);无法获取表单输入项列表,表单中的参数用request.getParameter()来获取,
struts-config.xml
<action path="/uploadaction"
name="TestForm" <!–指定formbean–><!--这里不用指定-->
type="UploadAction"
parameter="method" >
<forward name="success" path="/success.jsp" />
</action>
现象:在struts-config.xml文件中,如果指定了formbean——name="TestForm" ,则文件无法正确上传,UploadAction中的fu.parseRequest( request)方法返回值为null;如果去掉了说明formbean的name属性,则文件可以正常上传。
原因:struts的RequestProccessor.process已经包含了处理文件上传的方法。如果在action配置中设置了formbean ,那么在你自己的action处理request之前,struts已经在RequestProccessor.populate方法中处理了request,因此,在自己的action中就取不到上传的文件了。
处理:如果要自己在action中处理文件上传工作,那么就不要在配置文件中配置formbean。
感谢http://hi.baidu.com/xiaweizhao_java/blog/item/daa8dff856209569024f56e1.html的作者!
分享到:
相关推荐
在 Java 环境下,Apache Commons FileUpload 库是常用来处理文件上传的工具。 首先,确保引入了 Apache Commons FileUpload 和 Commons IO 的依赖库。在上述问题中,`DiskFileUpload` 已经被弃用,应该使用 `...
- `Commons-fileupload-1.2.1.jar` 和 `Commons-io-1.3.2.jar`:Apache Commons FileUpload和IO,处理HTTP多部分上传请求。 2. **web.xml配置**: - 配置了Struts2过滤器,`<filter-class>org.apache.struts2....
- `Commons-fileupload-1.2.1.jar` 和 `Commons-io-1.3.2.jar`: Apache Commons FileUpload和IO,支持HTTP文件上传功能。 2. **web.xml配置**: - `<web-app>` 标签定义了Servlet容器中的Web应用配置。 - `...
本文将深入探讨"ext3.x和2.x上传文件例子upolad"这一主题,结合使用`commons-fileupload-1.2.jar`库进行多文件上传的操作。 首先,`ext3.x`和`ext2.x`是指Linux文件系统的两个版本。`ext3`是`ext2`的扩展,引入了...
commons-fileupload-1.2.1实现文件上传 需导入commons-fileupload-1.2.1.jar和 commons-io-1.3.2.jar upload2.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <!DOCTYPE ...
Struts2的FileUpload插件是实现这一功能的关键,它依赖于Apache的Commons FileUpload库。开发者需要配置Struts2的Action类来接收并处理文件,使用File和FileItem接口来获取上传的文件信息。此外,还需要在struts.xml...
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet....
6. **commons-fileupload-1.2.1.jar**:Apache Commons FileUpload库用于处理HTTP请求中的文件上传功能,是Web应用中处理用户上传文件的常见选择。 7. **slf4j-api-1.5.2.jar** 和 **slf4j-log4j12-1.5.2.jar**:...
这里可能使用了`commons-fileupload-1.2.2.jar`,这是一个Apache Commons FileUpload库,帮助开发者处理文件上传,包括分块上传和大文件上传,同时提供了处理多文件上传的能力。 4. **实时进度条**:EXT提供了丰富...
本文将详细介绍如何使用Apache Commons FileUpload库来实现文件上传功能,并通过一个具体的示例进行演示。 #### 一、Apache Commons FileUpload介绍 Apache Commons FileUpload是一个开源项目,用于帮助开发者轻松...
本实例聚焦于利用ExtJS进行文件上传操作,结合了JavaScript、Apache服务器以及两个关键的Java库:Commons IO和Commons FileUpload。 1. **ExtJS 文件上传组件**: ExtJS 提供了多种组件用于文件上传,如`Ext.form....
Java中可以使用Apache Commons FileUpload库来解析上传请求中的多部分数据。 7. **错误处理和反馈**:在文件上传过程中,可能出现各种错误,如文件过大、格式不正确、网络问题等。因此,良好的用户反馈机制是必要的...
commons-fileupload-1.3.1.jar commons-io-2.4.jar commons-lang3-3.3.2.jar commons-logging-1.0.4.jar commons-pool-1.5.4.jar commons-pool2-2.0.jar core-2.2.jar dom4j-1.6.1.jar dozer-5.5.1.jar druid-1.0.18...
在这个例子中,可能使用了Apache Commons IO库(`commons-io-1.4.jar`)和Apache Commons FileUpload库(`commons-fileupload-1.2.jar`)。这两个库是Java领域处理文件上传的常用工具。Commons FileUpload负责解析HTTP...
Commons-FileUpload(以及Commons-IO) 注:加*的包可使用MyEclipse自带的类库。 Web框架(跨浏览器) FckEditor 可视化编辑HTML XLoadTree 动态加载XML生成JavaScript树组件 jQuery AJAX框架-查询DOM对象,简洁,...
其次,`commons-fileupload.jar`是Apache Commons FileUpload库,专门用于处理HTTP请求中的多部分表单数据,包括文件上传。在处理图片上传时,我们需要解析请求中的文件项,将其保存到服务器上。这个库简化了这个...
本文将详细介绍一个基于Servlet的多文件上传示例,该示例使用了Apache Commons FileUpload库来简化文件上传过程。下面将从以下几个方面进行详细解释: 1. **环境配置与依赖** 2. **ServletFileUpload类简介** 3. **...
apache-commons框架 · commons-validator-1.3.1-src.zip · commons-lang3-3.2.1-src.zip · commons-fileupload-1.2.1-src.zip · commons-dbutils-1.3-bin.zip · commons-pool-1.5.5-bin.zip · ...
你可以使用诸如Apache Commons FileUpload库来解析请求并保存上传的图片。此外,后端还需要处理错误,如文件大小限制、文件类型检查等。 6. **文件存储**:上传的图片会被保存在服务器的某个目录下,可能需要设定...
在Action类中,你可以声明一个`java.io.File`或`org.apache.struts2.interceptor.FileUpload`类型的字段,Struts2会自动将上传的文件内容填充到这些字段中。例如: ```java private File file; private String ...