struts2文件上传与下载


文件上传:

upload.jsp表单:

     1):表单必须使用POST方式提交;

     2):使用二进制编码:multipart/form-data

     3):<input type="file"name=""/>;

 

                <!-- 显示表单提交的错误信息 -->
                <s:fielderror></s:fielderror>
                <form action="up/upload" method="post" enctype="multipart/form-data">  
			用户名: <input type="text" name="username" /><br/>
		        文件:<input type="file" name="myUpload" id="file" /> <br/> 
			<input type="submit" value="上传"/>
			<input type="reset" value="重置"/>
		</form>

Struts2底层使用的是Apache的上传组件(commons-fileupload-1.3.1.jar)实现文件的上传

Struts2文件上传的细节:

Struts2中的FileUploadInterceptor拦截器完成了文件上传设置操作:


struts2.xml:

    <package name="hell" extends="struts-default" namespace="/up">
    	<!-- 定义的拦截器 -->		
		<interceptors>
			<interceptor-stack name="myStack">
				<!-- 修改FileUploadIntercepto拦截器的默认值-->
				<interceptor-ref name="fileUpload">
					<!-- 设置上传的最大文件的大小1M 单位 1byte = 8bit -->
					<param name="maximumSize">1048576</param>
					<!-- 设置允许上传的文件扩展名类型(小心属性名坑, 查看源码setXxx)-->
					<param name="allowedExtensions">jpg,gif</param>
				</interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="myStack"></default-interceptor-ref>
    
    	<action name="upload" class="cn.com.my.FileUpLoadAction" method="upload">
    		<result name="success" type="dispatcher">/success.jsp</result>
                <result name="input" type="dispatcher">/upload.jsp</result>
    	</action>
    </package>

action:

public class FileUpLoadAction extends ActionSupport{
	private String username;
	//命名框架固定格式 对应file表单的name值 
	private File myUpload;				//上传的文件
	private String myUploadFileName;	//上传的文件名
	private String myUploadContentType;	//上传的文件类型  -- image/jpeg
	
	public String upload() throws IOException {
		//直接保存到磁盘中
		//将文件保存到当前/upload文件夹中
		//获取到指定相对路径对应的绝对路径。
		String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
		System.out.println(realPath);
		
		//构建一个目标文件,将数据拷贝到目标文件中
		File destFile = new File(realPath,myUploadFileName);
		FileUtils.copyFile(myUpload, destFile);
		
		return SUCCESS;
	}

        //getter/setter	
}


文件下载:

Struts2提供 stream 结果类型,专门用于支持文件下载功能的。

 属性修参考  struts-default.xml中 stream 拦截器

<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

contentType:  指定被下载文件的文件类型;

inputName:  指定被下载文件的入口输入流;

contentDisposition: 指定下载的文件名;

bufferSize: 指定下载文件时的缓冲大小。


表单:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
    
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>     
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>资源下载</h3>
	<a href="down/download.action?filename=file1.zip">资源1</a><br/>
	<a href="down/download.action?filename=file2.zip">资源2</a><br/>
 	
</body>
</html>

struts2.xml:

    <package name="downPkg" extends="struts-default" namespace="/down">
    	<action name="download" class="cn.com.my.DownloadAction" method="download">
    		<!-- type="stream" 指定当前请求以下载的方法响应到浏览器中 -->		
    		<result name="success" type="stream">
    			<!-- 可以通过修改inputName属性的值 修改处理下载请求的方法名称 -->
    			<param name="inputName">inputStream</param>
    			<!-- 指定下载的文件名
    					attatchment: 浏览器以下载的方式处理当前数据,不打开文件
    					filename: 指定下载的文件名为当前文件的文件名
    			 -->
    			<param name="contentDisposition">attatchment;filename=${filename}</param>
    		</result>
    	</action>
    </package>

action:

package cn.com.my;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{
	
	private String filename;
	private File file;
	
	public String download() {
		
		//根据传递来的文件名找到对应的文件。
		String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/download");
		System.out.println(filename);
		System.out.println(realPath);
		file = new File(realPath,filename);
		
		//将找到的文件响应到浏览器弹出下载页面 下载
		//返回值不应该对应一个物理地址(不是简单页面跳转)
		return SUCCESS;
	}
	
	//给struts2框架调用, 将获取到要下载的文件数据响应给浏览器
	public InputStream getInputStream() throws Exception {
		return new FileInputStream(file);
	}
	
	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值