Struts2 上传和下载的原理:
Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件,二下载则是通过输入流InputStream 的方式获得服务端文件,然后设置关联方式为保存而不是打开,就可以了。
首先看看我的上传页面:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <center> <form action="fileAction" method="post" enctype="multipart/form-data"> <!-- 上传者的姓名:<input type="text" name="uname" /><br><br> --> 上传文件一:<input type="file" name="files"><br></br> 上传文件二:<input type="file" name="files"><br></br> 上传文件三:<input type="file" name="files"><br></br> <input type="submit" name="method:doUpload" value="开始上传"/> </form> </center> </body> </html>
大家一定要注意的事和其他方式文件上传一样form
<form action="fileAction" method="post" enctype="multipart/form-data">
因为涉及到多文件上传因此我定义了几个相同name属性值的
<input type="file" name="files"><br></br>
因为我有用到数据库保存文件的信息因此我定义了一个实体类:
package com.lyl.entity;
import java.util.Date;
/**
* MyFile entity.
*
* @author MyEclipse Persistence Tools
*/
public class MyFile implements java.io.Serializable {
// Fields
private String fileId;
private String fileName;
private String fileContentType;
private Date fileUploadDate;
// Constructors
/** default constructor */
public MyFile() {
}
// Property accessors
public String getFileId() {
return this.fileId;
}
public void setFileId(String fileId) {
this.fileId = fileId;
}
public String getFileName() {
return this.fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileContentType() {
return this.fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public Date getFileUploadDate() {
return this.fileUploadDate;
}
public void setFileUploadDate(Date fileUploadDate) {
this.fileUploadDate = fileUploadDate;
}
}
然后我们看看后台如何处理上传的,我定义一个FileAction处理
页面如下:
package com.lyl.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import com.lyl.dao.FileDAO;
import com.lyl.dao.FileDaoImpl;
import com.lyl.entity.MyFile;
import com.opensymphony.xwork2.ActionContext;
public class FileAcion {
用于保存文件的DAO类:
private FileDAO fileDao=new FileDaoImpl();
//如果不提供set和get方法将不能在页面(通过对象.属性的格式)赋值
private MyFile myFile = new MyFile();
// 保存表单页面的上传文件的集合
private List<File> files;
// 保存上传文件的文件名的集合
private List<String> filesFileName;
// 保存上传文件的类型集合
private List<String> filesContentType;
//下载相关的参数
//指定要下载文件的输入流
private InputStream is;
//指定下载文件的类型
private String fileType;
//指定下载文件的名字
private String fileName;
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public InputStream getIs() {
return is;
}
public void setIs(InputStream is) {
this.is = is;
}
// 上传文件的方法
public String doUpload() throws Exception {
System.out.println("进入了上传的方法");
// 定义保存的路径
ServletContext application = ServletActionContext.getServletContext();
// 定义相对路径(定义的路为WebRoot目录下的指定位置)
String realPath = application.getRealPath("/upload");
for(int i=0;i<files.size();i++){
//以每一个上传文件生成一个输入流
InputStream is=new FileInputStream(files.get(i));
//创建一个fileId作为文件在硬盘上保存的的名字
String fileId=UUID.randomUUID().toString().replace("-", "");
//创建个输出流(以目标文件生成的流)
OutputStream os=new FileOutputStream(new File(realPath+"/"+fileId));
byte [] b=new byte[1024];
int len=is.read(b);
while(len !=-1){
os.write(b, 0 ,b.length);
len=is.read(b);
}
os.close();
is.close();
//给MyFile实体赋值
myFile.setFileId(fileId);
myFile.setFileName(filesFileName.get(i));
myFile.setFileContentType(filesContentType.get(i));
fileDao.addFile(myFile);
}
return "success";
}
//查询所有的的文件
public String listFile(){
System.out.println("进入了list方法");
List<MyFile> myFilList=fileDao.listFile();
ActionContext context=ActionContext.getContext();
Map request=(Map)context.get("request");
request.put("myFilList", myFilList);
return "list";
}
// 下载文件的方法
public String doDownLoad() throws Exception {
System.out.println("进入了下载的方法");
ServletContext application=ServletActionContext.getServletContext();
//获得文件上传后的路径
String realPath=application.getRealPath("/upload");
System.out.println("下载文件编号为--"+myFile.getFileId());
myFile=fileDao.loadFile(myFile);
this.fileName= new String(myFile.getFileName().getBytes(),"ISO8859-1");
this.fileType=myFile.getFileContentType();
File file=new File(realPath+"/"+myFile.getFileId());
this.is=new FileInputStream(file);
return "down";
}
public List<File> getFiles() {
return files;
}
public void setFiles(List<File> files) {
this.files = files;
}
public List<String> getFilesFileName() {
return filesFileName;
}
public void setFilesFileName(List<String> filesFileName) {
this.filesFileName = filesFileName;
}
public List<String> getFilesContentType() {
return filesContentType;
}
public void setFilesContentType(List<String> filesContentType) {
this.filesContentType = filesContentType;
}
public MyFile getMyFile() {
return myFile;
}
public void setMyFile(MyFile myFile) {
this.myFile = myFile;
}
}
最后看看,我们的配置文件:
<?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>
<include file="struts-default.xml" />
<package name="myFile" extends="struts-default" >
<action name="fileAction" class="com.lyl.action.FileAcion">
<result name="success" type="redirect">/fileAction!listFile.action</result>
<result name="list">/fileList.jsp</result>
<result name="down" type="stream">
<!-- 内容类型,例如:*.jpg就是image/jpeg -->
<param name="contentType">${fileType}</param>
<!-- 数据来源 -->
<param name="inputName">is</param>
<!-- 确保文件是被下载,而非打开 -->
<param name="contentDisposition">
attachment;filename="${fileName}"
</param>
<!-- 缓存大小单位字节 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
也就这些了,如有不同的意见可以交流下啊![]()
本文介绍Struts2框架中的文件上传与下载实现方法,包括前端页面设计、后端处理逻辑及配置文件设置等关键步骤。

被折叠的 条评论
为什么被折叠?



