上篇博客实现的是单个文件上传,这次实现多个文件上传。其中命名规范跟上篇博客一样。
思路如下:多个文件上传,需要注入多个文件对象中,所以Action中定义多个文件,因此是定义文件数组。在这个实例中,我们应用List来实现。
其实,在上传文件,无论是单个文件还是多个文件,就是从上传的临时文件或文件组(循环)读到本地中。
因此,java的io基础是关键。遇到文件的读写,发现io流基础不牢固,回头又重新看了马士兵的io流并实践io流小例子。其中io流的总结参见博客《Java
IO流分析整理》
在多文件上传中,利用缓冲流进行写入文件中。实例如下:
package com.upload;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;
import java.util.Map;
import javassist.bytecode.Descriptor.Iterator;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/*
* 多文件上传
*/
public class MultiUpload extends ActionSupport {
private List<File> file;
private List<String> fileFileName;
private List<String> fileContentType;
//每个文件的大小
private Long maximumSize;
//文件的类型
private String allowedTypes;
public Long getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(Long maximumSize) {
this.maximumSize = maximumSize;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
public List<File> getFile() {
return file;
}
public void setFile(List<File> file) {
this.file = file;
}
public List<String> getFileFileName() {
return fileFileName;
}
public void setFileFileName(List<String> fileFileName) {
this.fileFileName = fileFileName;
}
public List<String> getFileContentType() {
return fileContentType;
}
public void setFileContentType(List<String> fileContentType) {
this.fileContentType = fileContentType;
}
public String execute() throws Exception {
String s=null;
File uploadFile =new File(ServletActionContext.getServletContext().getRealPath("file"));
if(!uploadFile.exists())
{
uploadFile.mkdir();
}
boolean[] flags=null;
//用于标识
flags=new boolean[file.size()];
//规定的上传文件格式分解
String[] fileType =allowedTypes.split(",");
// 判断文件大小是否符合条件
for(int i=0;i<file.size();i++)
{
flags[i]=false;
//若是上传的文件大小大于规定的长度
if(maximumSize<file.get(i).length())
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", "文件太大,不能上传");
return "input";
}
//判断上传的文件的类型
for(int j=0;j<fileType.length;j++)
{
if(fileContentType.get(i).equals(fileType[j]))
{
flags[i]=true;
}
}
}
//然后判断是否存在类型的不合格
for(int k=0;k<flags.length;k++)
{
if(flags[k]==false)
{
Map request=(Map)ServletActionContext.getContext().get("request");
request.put("errorMessage", "文件类型不符合");
return "input";
}
}
//把临时文件保存为本地文件
for(int i=0;i<file.size();i++)
{
FileReader fis=new FileReader(file.get(i));
FileWriter fos=new FileWriter(uploadFile +"\\"+fileFileName.get(i));
BufferedReader br=new BufferedReader(fis);
BufferedWriter bw=new BufferedWriter(fos);
while((s=br.readLine())!=null)
{
bw.write(s);
}
}
return "success";
}
}
struts.xml配置文件,和单个文件上传配置类似如下:
<action name="multiUpload" class="com.upload.MultiUpload">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
<result name="input">input.jsp</result>
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</action>
Jsp页面如下:
<form action="multiUpload" enctype="multipart/form-data" method="post">
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value="登录">
</form>
对于上传文件中的文件大小和文件类型的限制,可以不用手动限制,在这两篇博客中,都自己手动在Action中编写代码,可以利用Struts2中的文件拦截器,直接在配置文件中的Action中进行配置:
<interceptor-ref name="fileUpload">
<param name="maximumSize">1000000</param>
<param name="allowedTypes">application/msword,text/plain</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
分享到:
相关推荐
直接将myeclipse工具导入项目fileupload即可测试
可以实现一次性上传多个文件,使用JavaScript动态添加一个上传文本框。是用struts2实现的
NULL 博文链接:https://wankunde.iteye.com/blog/904409
本篇文章主要介绍了struts2实现多文件上传的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
struts2文件上传。 包括一个上传单个文件的示例, 和一个多文件上传的示例, 包含所需要的所有jar文件。
一个strtus2框架的文件上传示例的小工程,可以直接import到eclipse中跑
12.5 上传多个文件示例 227 12.6 小结 230 第13章文件的下载 231 13.1 文件下载概述 231 13.2 Stream结果类型 232 13.3 文件下载功能的编程实现 235 13.4 小结 238 第14章提高Struts应用程序的安全性 239 ...
12.5 上传多个文件示例 227 12.6 小结 230 第13章 文件的下载 231 13.1 文件下载概述 231 13.2 Stream结果类型 232 13.3 文件下载功能的编程实现 235 13.4 小结 238 第14章 提高Struts应用程序的安全性 239 14.1 ...
这里使用struts2的common-FileUpload框架同时上传多个图片的简单示例,灵活地用数组封装多个文件域(name相同)
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
第三步:在登陆后的界面文本框输入文本,然后发送 可以同时启动多个客户端 实现群聊。 浮动的广告 嵌套在html中 各种EJB之间的调用示例 7个目标文件 摘要:Java源码,初学实例,EJB调用实例 各种EJB之间的调用源码...
DFS文件读写 网络爬虫之Spider Java正则表达式的总结关键词: Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及...
Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...
Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...
Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...
Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...