Struts2之文件上传和下载
程序员文章站
2024-02-01 13:27:52
...
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>
也就这些了,如有不同的意见可以交流下啊
上一篇: Python实现的tab文件操作类分享
下一篇: 用python读写excel的方法