在实际项目中,由于要上传的图片比较多,我们需要对图片名称做一些处理,以避免图片名称相同,造成后者覆盖前者的意外。所以action中我们可以这样写:
package bag;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class ManyUploadAction extends ActionSupport {
private static final int BUFFER_SIZE = 16 * 1024;
// 使用File数组封装多个文件域对应的文件内容
private File[] file;
// 使用字符串数组封装多个文件域对应的文件名
private String[] fileFileName;
// 接受依赖注入的属性
private String savePath;
// 结果显示消息
private String msg;
// 只用这个方法也可以实现多图片上传功能
public String execute() throws Exception {
// 取得需要上传的文件数组
File[] files = this.getFile();
// 遍历每个需要上传的文件
for (int i = 0; i < files.length; i++) {
fileFileName[i] = i + new Date().getTime()
+ getExtention(fileFileName)[i];
// 以服务器的文件保存地址和原文件名建立上传文件输出流
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"
+ getFileFileName()[i]);
System.out.println(getSavePath() + "\\" + getFileFileName()[i]);
// 以每个需要上传的文件建立文件输入流
FileInputStream fis = new FileInputStream(files[i]);
// 将每个需要上传的文件写到服务器对应的文件中
byte[] buffer = new byte[BUFFER_SIZE];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
}
this.msg = "上传成功!";
return SUCCESS;
}
// 获得每个文件的扩展名
public String[] getExtention(String[] fileNames) {
String[] extentions = new String[fileNames.length];
for (int i = 0; i < extentions.length; i++) {
int pos = fileNames[i].lastIndexOf(".");
extentions[i] = fileNames[i].substring(pos);
}
return extentions;
}
public File[] getFile() {
return file;
}
public void setFile(File[] file) {
this.file = file;
}
public String[] getFileFileName() {
return fileFileName;
}
public void setFileFileName(String[] fileFileName) {
this.fileFileName = fileFileName;
}
public String getSavePath() {
return ServletActionContext.getRequest().getRealPath(savePath);
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
这时注意到 execute方法中的fileFileName[i] ,我们给它以毫秒时间进行命名,但意外的是这是一个数组,执行上传时,三张图片产生的毫秒时间是相同的,导致结果你只能看到最后一张图片,因为他们的图片名称处理后是一样的,后来者覆盖了前面的,结果只剩一张了,那么在实际操作中,我们就有必要对它们再做其他处理,比如:在这里我在名称前面加上了循环变量i,那么三个名称就区分开了,结果当然就是我们想要的了。
相关文件还有:manyupload.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>使用集合同时上传多个文件</title> </head>
<body>
<s:form name="many" action="manyupload.action" method="post"
enctype="multipart/form-data">
<s:file label="图片1:" name="file"></s:file>
<s:file label="图片2:" name="file"></s:file>
<s:file label="图片3:" name="file"></s:file>
<s:submit value="上传"></s:submit>
</s:form>
</body>
</html>
struts.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="uploadspace" extends="struts-default">
<action name="manyupload" class="bag.ManyUploadAction">
<param name="savePath">/UploadImages</param>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/bmp,image/PNG,image/gif,image/JPEG,image/JPG
</param>
<param name="maximumSize">1024000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<!-- <interceptor-ref name="fileUploadStack"></interceptor-ref>-->
<result name="success">/result.jsp</result>
<result name="error">/result.jsp</result>
</action>
</package>
</struts>
这里注意到:我把<interceptor-ref name="fileUploadStack"></interceptor-ref>注释掉了,因为它跟上面的代码
<param name="savePath">/UploadImages</param>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
image/bmp,image/PNG,image/gif,image/JPEG,image/JPG
</param>
<param name="maximumSize">1024000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
的作用是相同的。这样写,是改变路径方便的,稍微一动就可以把savePath的值改了,不需要去寻找action中的代码。
而要用在xml中只写一行代码,那可要在action中费工夫了,这时候,要把
return ServletActionContext.getRequest().getRealPath(savePath);
改成
return ServletActionContext.getRequest().getRealPath("/UploadImages");
可别忘了最重要的事:导入jar包struts2-core-2.0.9.jar,commons-fileupload-1.2.jar,commons-io-1.1.jar,freemarker-2.3.8.jar,xwork-2.0.4.jar,commons-logging-1.0.4.jar,commons-io-1.1.jar。
然后执行,在result.jsp中看结果,是一样的,只是个人选择的问题。
分享到:
相关推荐
一个swfupload+struts2实现多文件上传的案例。
google搜到的。我看大神的文章发布时间是2014年5月。亲测好用。 某度搜技术类的真真真心不行。
利用AJAX传递JSON数组,后台struts2的action接收。 详细代码简单易懂。
基于struts2的用数组接受多个文件上传+过滤器 用数组接受的同时多文件上传
使用struts2表单传值,可以传一个或者是作为一个对象的各个属性传,都非常灵活便捷。但是如果我们需要传一个数组并希望struts正确接收,该怎么处理呢? 下面我将通过普通表单和ajax两种方式讲解。首先我们有如下一个...
亲自做了一个struts2后台接收前台jsp页面传来的数组参数demo,因为参考网上的资源如用webwork表单提交等集成到项目有问题,所以做了一个单独的demo,经测试,用表单提交类似users[0].name,users[1].name的数组参数是...
在struts2基础上实现的包括单文件、多文件的上传及下载
其实只有一点struts2 iterator标签遍历二维数组
js ajax请求实现 struts2 action js ajax请求实现 struts2 action js ajax请求实现 struts2 action js ajax请求实现 struts2 action js ajax请求实现 struts2 action
struts2中实现文件上传 struts2中实现CRUD struts2中的OGNL struts2的新表单标志的使用 struts2与AJAX一 struts2与AJAX二 struts2与AJAX三 struts2中用Spring实现IOC struts2中的零配置与IOC struts2介绍之使用连接...
论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...
用struts2实现上传控制上传文件类型、大小以及多文件上传
struts2标签使用例子 struts2标签使用例子 struts2标签使用例子struts2标签使用例子
struts2文件上传struts2文件上传struts2文件上传struts2文件上传struts2文件上传struts2文件上传struts2文件上传struts2文件上传
使用struts2框架实现图片上传,不需要js开发
Struts2 code jar+实现struts2步骤文档
struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload
使用jsp+struts2实现前台分页技术
2.能够对上传路径进行配置文件指定(upload.properties),使用了一些类似单例模式的静态代码块 3.Struts2进行下载处理,能对上传的所有文件进行下载(多个) 4.文件保存的名称UUID生成,不过显示并下载的名称都是原...
Struts2实现文件上传的功能,简洁方便,欢迎下载。