欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>

 

 

也就这些了,如有不同的意见可以交流下啊Struts2之文件上传和下载
            
    
    博客分类: 框架技术(Struts+Hibernate+Spring) Struts2文件上传下载批量