struts实现文件上传下载_struts上传文件-程序员宅基地

技术标签: struts2  struts2.0  

1.jsp中表单实现上传

	<body>
		 
		<s:form enctype="multipart/form-data" method="post" theme="simple" action="upload.action">
        选择文件一: <s:file name="upload"></s:file><s:submit value="上传"></s:submit>
		</s:form>
	</body>
2.过滤器截取,到达配置文件,调用UploadAction


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <constant name="struts.custom.i18n.resources" value="message"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<!-- 单个文件上传 -->
		<action name="upload" class="com.yh.struts.action.UploadAction">
		  <param name="savepath">pic</param>
		  <result>/success.jsp</result>
		</action>
		<!-- 多文件上传 -->
		<action name="mupload" class="com.yh.struts.action.MutiUploadAction">
		  <param name="savepath">pic</param>
		  <result>/success.jsp</result>
		</action>
		<!-- 文件下载 -->
		<action name="down" class="com.yh.struts.action.DownAction">
		  <param name="path">upload</param><!-- 下载文件路径:业务action中的属性 -->
		  <result type="stream">
		    <param name="contentType">application/octet-stream</param>
		    <param name="contentDisposition">attachment;fileName=${fileName}</param>
		    <param name="inputName">inputStream</param>
		  </result>
		</action>
	</package>
</struts>  

4.DownAction extends ActionSupport----------------------实现单文件下载

点击链接,发送action,给过滤器获取fileName=${fileName}   可执行文件application/octet-stream


  <body>
   <a href="down.action?fileName=1.png">下载此文件</a>
  </body>
</pre>//<span style="white-space:pre"> </span><action name="down" class="com.yh.struts.action.DownAction">//<span style="white-space:pre"> </span> <param name="path">upload</param><!-- 下载文件路径:业务action中的属性 -->//<span style="white-space:pre"> </span> <result type="stream">//<span style="white-space:pre"> </span>   <param name="contentType">application/octet-stream</param>//<span style="white-space:pre"> </span>   <param name="contentDisposition">attachment;fileName=${fileName}</param>//<span style="white-space:pre"> </span>   <param name="inputName">inputStream</param>//<span style="white-space:pre"> </span> </result>//<span style="white-space:pre"> </span></action>           <p></p><p></p><p></p><pre name="code" class="java">import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownAction extends ActionSupport {
	private String fileName;
	private String path;

	private InputStream inputStream;

	public String getFileName() {
		return fileName;
	}

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

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public InputStream getInputStream() {
		String filePath = ServletActionContext.getServletContext().getRealPath(path)+ "/" + this.getFileName();
//C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\struts04\upload/1.png
		try {
			return new FileInputStream(filePath);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}

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

}

3. UploadAction extends ActionSupport----------- 单文件上传

upload和表单的name值相同       uploadContentType文件类型    uploadFileName文件名字   命名规范-------------------     savepath在action中定义,存放至服务器端的文件夹名字

</pre><p></p><p></p><pre name="code" class="java"><pre name="code" class="java">import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
	private File upload;// File ��ҳ���пؼ���name��ͬ
	private String uploadContentType;// �ؼ���ContentType:�ϴ��ļ�����
	private String uploadFileName;// �ؼ���FileName:�ϴ��ļ�����
	private String savepath;//������������ϴ��ļ����ļ������

	public String getSavepath() {
		return savepath;
	}

	public void setSavepath(String savepath) {
		this.savepath = savepath;
	}

	public File getUpload() {
		return upload;
	}

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

	public String getUploadContentType() {
		return uploadContentType;
	}

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

	public String getUploadFileName() {
		return uploadFileName;
	}

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

	public String execute() {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(upload);
			fos = new FileOutputStream(ServletActionContext.getServletContext()
					.getRealPath("/")
					+ this.getSavepath()+"/" + this.getUploadFileName());

			byte[] b = new byte[fis.available()];
			fis.read(b);
			fos.write(b);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if (fis != null)
					fis.close();
				if (fos != null)
					fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return SUCCESS;
	}
}


5.多文件上传   MutiUploadAction extends ActionSupport

单文件:upload和表单的name值相同       uploadContentType文件类型    uploadFileName文件名字    savepath在action中定义,存放至服务器端的文件夹名字

多文件: File[]  upload和表单的name值相同     String[] uploadContentType文件类型 String[] uploadFileName文件名字    savepath在action中定义

<s:form enctype="multipart/form-data" method="post" theme="simple"action="upload.action">        选择文件一: <s:file name="upload"></s:file>        选择文件二: <s:file name="upload"></s:file><s:submit value="上传"></s:submit></s:form>

</pre><p><span style="white-space:pre">		</span><!-- 多文件上传 --><span style="white-space:pre">		</span><action name="mupload" class="com.yh.struts.action.MutiUploadAction"><span style="white-space:pre">		</span>  <param name="savepath">pic</param><span style="white-space:pre">		</span>  <result>/success.jsp</result><span style="white-space:pre">		</span></action></p><p></p><p><pre name="code" class="java">import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class MutiUploadAction extends ActionSupport {
	private File[] upload;// File ��ҳ���пؼ���name��ͬ
	private String[] uploadContentType;// �ؼ���ContentType:�ϴ��ļ�����
	private String[] uploadFileName;// ������FileName:�ϴ��ļ�����
	private String savepath;// ������������ϴ��ļ����ļ������

	public String getSavepath() {
		return savepath;
	}

	public void setSavepath(String savepath) {
		this.savepath = savepath;
	}

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

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

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

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

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

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

	public String execute() {
		for (int i = 0; i < upload.length; i++) {
			FileInputStream fis = null;
			FileOutputStream fos = null;
			try {
				fis = new FileInputStream(upload[i]);
				fos = new FileOutputStream(ServletActionContext.getServletContext()
						.getRealPath("/")
						+ this.getSavepath() + "/" + this.getUploadFileName()[i]);

				byte[] b = new byte[1024 * 1024];<pre name="code" class="java">                                  fis.read(b);fos.write(b);<pre name="code" class="java">} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (fis != null)fis.close();if (fos != null)fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return SUCCESS;}}


















版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lixiao1048/article/details/51648211

智能推荐

Linux mint 18 安装NVIDIA显卡驱动_linux mint 19升级nvidia启动黑屏-程序员宅基地

文章浏览阅读7.9k次。这个文章我也是百度和Google了很多的文章,然后加上自己的实际操作才写出了的然后不是和其他那些教程一样,我们这个教程不复杂但是却很实用我用的是Cinnamon的桌面,安装方法很简单,但是没想到的话的确要让人抓狂我们首先来到Cinnamon桌面的菜单栏Menu这里然后再上面Sreach那里输入Drivers然后就会出来一个Drivers manager点进去就会发现有个实用的界面,这个Manager_linux mint 19升级nvidia启动黑屏

使用javascript批量清空RadioButtonList数组选中状态_清空radio的值-程序员宅基地

文章浏览阅读676次。function ResetButton() { var arr = new Array("XRadioButtonList1", "XRadioButtonList2", "XRadioButtonList3", "XRadioButtonList4", "XRadioButtonList5"); for (j = 0; j <= arr.length -1; j++) { de..._清空radio的值

python 主线程结束后子线程不结束_Python多线程:主线程等待所有子线程结束-程序员宅基地

文章浏览阅读965次。from time import ctimeimport threadingimport timedef a():#for i in range(5):print('Program a is running... at ', ctime(),u'.线程名为:',threading.current_thread().name )time.sleep(0.2)def b(x):#for i in ra..._python主线程结束了子线程还不关闭

Java整合rabbitMQ错误信息_reply-code=530, reply-text=not_allowed - access to-程序员宅基地

文章浏览阅读681次。1.(reply-code=530, reply-text=NOT_ALLOWED - access to vhost ‘/’ refused for user ‘admin’, class-id=10, method-id=40)表明该用户没有访问虚拟机的权限通过 http://ip:15672,进入控制台然后点击Admin表明 ceshi用户没有访问虚拟机的权限点击要修改的用户点击赋予权限然后再次查看的时候就可以了2.java.net.ConnectException: Con_reply-code=530, reply-text=not_allowed - access to vhost '/' refused for use

Neither BindingResult nor plain target object for bean name-程序员宅基地

文章浏览阅读1.8k次。场景:spring MVC作form提交:Neither BindingResult nor plain target object for bean name报错时的代码:<form:form method=“post” action=“register.html”>修正后的代码:<form:form method=“post” action=“register.html” commandName="user>Spring给我们提供了一个commandName属性,我们可以_neither bindingresult nor plain target object for bean name 'registthirdpart

搭建MyBatis步骤及配置文件的说明_.net生成mybatis配置文件-程序员宅基地

文章浏览阅读814次。搭建MyBatis步骤及配置文件的说明别名设置,1.导入相关jar包2.在resource文件下编写MyBatis核心配置文件Properties优化3.编写MyBatis工具类4.创建实体类5.编写Mapper接口类6.编写Mapper.xml配置文件Maven静态资源过滤问题_.net生成mybatis配置文件

随便推点

树莓派3b连接并调试华为ME-909s-821 4G模块_树莓派3b+ 4g上网-程序员宅基地

文章浏览阅读3.8k次。目的:实现树莓派连接4G模块提供网络材料:树莓派3b 华为4G模块:HUAWEI ME909s-821 PCIE转USB开发板 10-15cm天线转接线,SMA公头外螺内孔 吸盘天线全向高增益天线,SMA公头外螺内孔步骤:1.模块插入开发板,天线转接线插在华为4G模块M字样一端,拧掉红色小帽,与高..._树莓派3b+ 4g上网

计算机用户文件夹怎么重命名,用户文件夹怎么改名-程序员宅基地

文章浏览阅读4.4k次。大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。文件夹命名的操作步骤是:1、在电脑上找到并右击需要重命名的文件夹,选择【重命名】选项。2、输入新的名字后按回车键即可。普通计算机文件夹是用来协助人们管理计算机文件的,每一个文件夹对应一块磁盘空间,它提供了指向对应空间的地址,它没有扩展名,也就不像文件的格式用扩展名来标识。但它有几种类型,如:文档、图片、相册、音乐、音乐集等等。文件..._用户文件夹怎么重命名

Linux文件系统恢复(数据误删恢复)_linux怎么恢复rm误删的xfs数据-程序员宅基地

文章浏览阅读2.1k次。Linux文件系统恢复(数据误删恢复)文章目录Linux文件系统恢复(数据误删恢复)inode与block用户通过文件名打开文件时,系统内部的过程查看文件对应的inode号码有两种方式用stat命令查看Linux系统文件三个重要的时间属性文件存储小结硬盘分区后的结构访问文件的简单流程inode的大小inode的作用硬链接与软连接模拟inode占用满的情况恢复误删除文件恢复XFS类型的文件inode与block文件数据包括元信息与实际数据文件存储在硬盘上,硬盘最小的存储单位时扇区,每个扇区存储512_linux怎么恢复rm误删的xfs数据

Linux tail命令_tail -1>-程序员宅基地

文章浏览阅读1.2k次。inux中tail命令---用于查看文件内容 最基本的是cat、more和less。 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /etc/passwd 2. 如果你想查看文件的后10行,可以使用tail命令,如: tail -10 /etc/passwd 或 tail -n 10 /etc/passwd tail -f /var/log/m_tail -1>

Java注解 编译_Java注解之编译时注解-程序员宅基地

文章浏览阅读422次。新建两个moduleannotation用来定义注解compiler用来编写处理注解的代码这两个module都要选择Java Library 那为什么要拆分两个module呢,因为编译期注解的处理代码是只在代码编译的时候使用的,所以这些代码要和主module分开拆成compiler,但是compiler又依赖于注解,主module也要使用注解。所以就将注解的定义也拆分出来。这样做的好处是可以...

##操作系统面试---进程调度方法_面试手撕操作系统的调度算法-程序员宅基地

文章浏览阅读918次。进程调度方法调度算法是指:根据系统的资源分配策略所规定的资源分配算法,如任务A在执行完后,选择哪个任务来执行,使得某个因素(如进程总执行时间,或者磁盘寻道时间等)最小。对于不同的系统目标,通常采用不同的调度算法。几个常用的操作系统进程调度算法。1 先来先服务调度算法(队列)(FCFS)First Come Fi..._面试手撕操作系统的调度算法

推荐文章

热门文章

相关标签