【Struts】Struts文件上传与下载

1.单文件上传

1.1 文件上传表单
<!-- 文件上传必须加enctype="multipart/form-data" --> 
<!-- 文件上传必须method="post" -->
<form action="/Struts05/uploadDemo" method="post" enctype="multipart/form-data">
	<!-- file的name属性值对应Action类的File upload --> 
	<input type="file" name="upload"/><br/>
	<input type="submit" value="上传"/>
</form>
1.2 struts.xml
<struts>	
    <constant name="struts.devMode" value="true"></constant>
    
    <!-- 整个项目上传文件允许的最大文件大小,单位:B  -->
    <!-- 全局常量,超出限制不会进入action -->
    <constant name="struts.multipart.maxSize" value="2097152000"></constant>
       
	<package name="default" extends="struts-default" namespace="/">
		<action name="*Demo" class="com.action.DemoAction" method="{1}">		                   
			<result name="success" >/upload_success.jsp</result>
			
			<!-- 文件大小丶文件格式校验不通过等上传失败会跳到input结果页 -->
			<!-- input结果页可以通过actionerror标签和fielderror获取文件上传错误信息  -->
			<result name="input" >/upload_fail.jsp</result>
			
			<!-- 为当次上传请求fileUpload拦截器设置参数 -->
            <interceptor-ref name="fileUpload">   
                <!--当次上传文件允许的最大文件大小,单位:B -->     
	            <param name="maximumSize ">209715200</param> 
	            <!-- 当次上传文件允许上传文件的MIME类型 -->   
	            <param name="allowedExtensions">.jpg,.png</param> 
	        </interceptor-ref>  
	          
	        <!-- 一旦显式调用了拦截器,就不会自动调用默认拦截器,为了不影响功能,这里必须显式调用默认拦截器 -->
	        <interceptor-ref name="defaultStack"></interceptor-ref>            
		</action>
	</package>		
</struts>
1.3 处理文件上传的Action
package com.action;

import java.io.File;
import java.io.IOException;

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

import com.opensymphony.xwork2.ActionSupport;

public class DemoAction extends ActionSupport {
	private String uploadFileName;   //文件名,包括扩展名,字段名格式:【file的name值+FileName】  
    private String uploadContentType;  //文件类型,字段名格式:【file的name值+ContentTyp】
    private File upload;     //文件对象,字段名对应表单的file的name属性
    
    
	public String upload(){
		
		try {
			//获取服务器端存放上传文件目录的物理路径			
			String path=ServletActionContext.getServletContext().getRealPath("/upload");
			
			//Eclipse和MyEclipse获取的路径不一样,根据实际path值查看上传成功的文件
			//System.out.println(path);
			
			//创建服务器端存储的文件
			//实际应用中文件名可以使用各种方式避免重名(UUID丶当前时间毫秒值丶随机数等)
			File destFile=new File(path,uploadFileName);
			
			//使用commons-fileupload把上传的文件复制到服务器端的目录下(struts自带,如果没有导入jar包)
			FileUtils.copyFile(upload, destFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return SUCCESS;
	}
	
		
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}	
}

2. 多文件上传

2.1 多文件上传表单
<!-- 文件上传必须加enctype="multipart/form-data" --> 
	<!-- 文件上传必须method="post" -->
	<form action="/Struts05/uploadDemo2" method="post" enctype="multipart/form-data">
		<!-- 多个同name值的file表单标签 --> 
		<input type="file" name="upload"/><br/>
		<input type="file" name="upload"/><br/>
		<input type="file" name="upload"/><br/>
		<input type="submit" value="上传"/>
	</form>
2.2 struts.xml
  • 参考1.2
2.3 处理多文件上传的Action
package com.action;

import java.io.File;
import java.io.IOException;

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

import com.opensymphony.xwork2.ActionSupport;

public class Demo2Action extends ActionSupport {
	//多文件上传字段属性都变成了数组(也可以用集合)
	private String[] uploadFileName;   //文件名数组,包括扩展名,字段名格式:【file的name值+FileName】  
    private String[] uploadContentType;  //文件类型数组,字段名格式:【file的name值+ContentTyp】
    private File[] upload;     //文件对象数组,字段名对应表单的file的name属性
	
	
	public String upload(){
		try {
			//获取服务器端存放上传文件目录的物理路径			
			String path=ServletActionContext.getServletContext().getRealPath("/upload");
												
			for (int i=0;i<upload.length;i++) {
				//对非空文件进行操作
				if(upload[i]!=null){
					//创建服务器端存储的文件					
					File destFile=new File(path,uploadFileName[i]);
					//复制文件到服务器路径
					FileUtils.copyFile(upload[i], destFile);
				}
			}
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		return SUCCESS;
	}

	public String[] getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(String[] uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	public String[] getUploadContentType() {
		return uploadContentType;
	}

	public void setUploadContentType(String[] uploadContentType) {
		this.uploadContentType = uploadContentType;
	}

	public File[] getUpload() {
		return upload;
	}

	public void setUpload(File[] upload) {
		this.upload = upload;
	}
}

3. 文件下载

3.1 下载页面
<a href="/Struts05/downloadDemo3?downloadFile=图片101.png">点击下载</a>
3.2 struts.xml配置
<action name="*Demo3" class="com.action.Demo3Action" method="{1}">
			   
          <!-- 结果类型设置为stream -->    
          <result name="success" type="stream">            
              <!-- 文件MIME类型,一般设置为application/octet-stream即可 -->     
              <param name="contentType">application/octet-stream</param>     
              <!-- 输入流名称,inputStream对应Action的getInputStream()方法 -->     
              <param name="inputName">inputStream</param>     
              <!-- 设置响应的HTTP表头信息 -->     
              <!-- attachment提示用户保存或打开文件,filename表示下载时显示的文件名 -->  
              <!-- 文件名对应Action的getFileName()方法 -->   
              <param name="contentDisposition">attachment;filename="${fileName}"</param> 
              <!-- 下载文件名是中文时转码防止中文乱码 -->
              <param name="encode">true</param> 
                  
              <!-- 设置文件下载的缓冲区的大小,单位是K -->     
              <param name="bufferSize">4096</param>               
          </result>                                		
	</action>
3.3 处理文件下载的Action
public class Demo3Action extends ActionSupport {
	private String downloadFile;  //请求参数:请求下载的文件名
	private InputStream inputStream;  //文件输入流,对应struts.xml的inputName参数值
	 //下载文件时弹框显示的文件名称(如果要显示中文需要struts.xml配置encode为ture)	
	private String fileName;     
	

	public String download() {
		try {
			//获取下载文件目录的物理路径
			String path = ServletActionContext.getServletContext().getRealPath("/upload");
			
			//因为请求参数查询字符串有中文,所以这里需要转码一下(配置了中文转码拦截器这里就不需要转码)
			downloadFile=new String(downloadFile.getBytes("ISO-8859-1"), "UTF-8");
			
			//构建下载文件的对象
			File file = new File(path, downloadFile);

			//创建下载文件的输入流
			FileInputStream fis = new FileInputStream(file);
			
			//把下载文件的输入流装进缓冲流中(增加性能)
			inputStream=new BufferedInputStream(fis);
			
			//设置下载文件弹窗显示的文件名称
			fileName="此文件下载由Struts05网站提供---"+downloadFile;
			
		} catch (IOException e) {

			e.printStackTrace();
		}

		return SUCCESS;
	}

	public String getDownloadFile() {
		return downloadFile;
	}

	public void setDownloadFile(String downloadFile) {
		this.downloadFile = downloadFile;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public InputStream getInputStream() {
		return inputStream;
	}

	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值