struts2实现文件上传(多文件上传)及下载
一、要实现文件上传,需在项目中添加两个jar文件

二、上传准备的页面
注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post

<h2>单个文件上传</h2>
<s:form action="upload.action" enctype="multipart/form-data" method="post">
<s:textfield name="title" label="标题"/>
<s:file name="upload" label="选择文件"/><br/>
<s:submit name="submit" value="上传文件"></s:submit> </s:form>

实现文件上传的Action类

public class UploadAction extends ActionSupport{
//封装上传文件属性
private File upload;
//封装上传文件的类型
private String uploadContentType;
//封装上传文件名称
private String uploadFileName;
//获取文件上传的路径
private String savePath;
@Override
public String execute() throws Exception {
byte[] buffer=new byte[1024];
//读取文件
FileInputStream fis=new FileInputStream(getUpload());
//保存文件
FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());
int length=fis.read(buffer);
while(length>0){
//每次写入length长度的内容
fos.write(buffer,0,length);
length=fis.read(buffer);
}
fis.close();
fos.flush();
fos.close();
return SUCCESS;
}
//获取文件上传的保存路径 通过读取存放目录获得保存路径
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}

在Action中使用了三个属性封装文件信息:
File类型的XXX属性,与表单的File控件的name属性一样,用于封装File控件对应的文件内容
String类型的xxxFileName属性,该属性名称由前面的File类型属性和FileName组合,是固定的语法,是封装File控件对应文件的文件名
String类型的XXXContentType属性,同样由xxx属性和ContentType组合而成,是固定语法,封装File控件对应文件的文件类型
配置Action:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<constant name="struts.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<!-- 文件上传 -->
<action name="upload" class="cn.happy.action.UploadAction">
<!-- 通过param参数设置保存目录的路径 -->
<param name="savePath">/upload</param>
<result name="success">ok.jsp</result>
</action> </package>
</struts>

上传成功后的结果页面:植入的value是Action类中所对应的实体类属性
您所上传的文件是:<s:property value="uploadFileName"/><br/>
文件类型:<s:property value="uploadContentType"/>
实现效果:


三、多文件上传
与单文件上传的不同之处在于 将三个属性的类型修改成数组类型,并通过for循环进行遍历

public class SomeUploadAction extends ActionSupport {
// 封装上传文件属性
private File[] upload;
// 封装上传文件的类型
private String[] uploadContentType;
// 封装上传文件名称
private String[] uploadFileName;
// 封装文件上传的路径
private String savePath;
public String execute() throws Exception {
byte[] buffer = new byte[1024];
for (int i = 0; i < upload.length; i++) {
FileInputStream fis = new FileInputStream(getUpload()[i]);
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"
+ this.getUploadFileName()[i]);
int length = fis.read(buffer);
while (length > 0) {
fos.write(buffer, 0, length);
length = fis.read(buffer);
}
fos.flush();
fos.close();
fis.close();
}
return SUCCESS;
}
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}

实现效果:


四、实现文件下载
为了支持文件的下载,Struts2框架提供了stream结果类型,该类型的作用就是专门用于实现文件下载的功能

实现文件下载:
由于在Struts2中实现文件下载时需要用到InputStream,所以在文件下载Action中要提供一个获得InputStream的方法,通过这个输入流将可以获取希望下载的文件内容

public class DownAction extends ActionSupport{
//读取下载文件的目录
private String inputPath;
//下载文件的文件名
private String fileName;
//读取下载文件的输入流
private InputStream inputStream;
//下载文件的类型
private String conetntType;
@Override
public String execute() throws Exception {
return SUCCESS;
}
//创建InputStream输入流
public InputStream getInputStream() throws FileNotFoundException {
String path=ServletActionContext.getServletContext().getRealPath(inputPath);
return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
}

通过Context上下文得到下载文件的实际路径,并构建了一个InputStream输入流实现文件下载读取
Action配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<constant name="struts.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default"> <!-- 文件下载 --> <action name="down" class="cn.happy.action.DownAction">
<param name="inputPath">/image</param>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>

在配置文件中,contentType参数决定了下载文件的类型。不同文件类型对应的参数值也是不同的。
通常情况下,contentType参数直接设置为application/octet-stream即可
contentDispoistion参数由两个部分组成,前面的部分表示处理文件的形式,如attachement表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔

当单击超链接时,即可下载



struts2实现文件上传(多文件上传)及下载的更多相关文章
- struts2 s:file标签使用及文件上传例子
<s:form action="uploadaction" method="post" enctype="multipart/form-da ...
- ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案
摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...
- Struts2 单个文件上传/多文件上传
1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action= ...
- struts2文件上传,文件类型 allowedTypes
struts2文件上传,文件类型 allowedTypes 1 '.a' : 'application/octet-stream', 2 '.ai' : 'application/postscript ...
- struts2.1.6教程九、文件上传下载(了解)
首先建立struts2UpDownLoad项目,搭建好struts2基本的开发环境. 上传实例 步骤一:upload.jsp代码如下: <s:form action="upload&q ...
- Struts2文件上传--多文件上传(插件uploadify)
公司需要把以前的Struts2自带的图片上传替换掉,因为不能一个file选择多个文件,本人直接百度搜索图片插件, 貌似就它(uploadify3.2.1)在最前面,也找过很多案例, 其中有不少问题, ...
- Struts2之文件上传(单文件/多文件)
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- struts2文件上传时获取上传文件的大小
利用struts2框架上传文件时,如果想要获取上传文件的大小可以利用下面的方式进行: FileInputStream ins = new FileInputStream(file); if (ins. ...
- SSH深度历险记(九) Struts2+DWZ+Uploadify多文件(文件和图片等。)上传
在gxpt_uas系统,为了实现文件(文件和图片等.,灵活配置)批量上传到mongodb,在学习的过程中,知道mongodb,功能,实现思路:在DWZ的基础上參考官方的实例结合现有的GXPT来实现,期 ...
随机推荐
- 从java文件和CS文件里查询方法使用次数工具
前几天,领导让我找一下老系统(Java)里getRemoteUser方法都哪个文件用了,package是什么,方法被调用了多少次,当时因为着急,所以,直接人工找的,但是以后要是再出现,人工找就太讨厌了 ...
- 前端学HTTP之客户端识别和cookie
前面的话 Web服务器可能会同时与数千个不同的客户端进行对话.这些服务器通常要记录下它们在与谁交谈,而不会认为所有的请求都来自匿名的客户端.本文主要介绍客户端识别及cookie机制 HTTP首部 HT ...
- .NET Core下的日志(1):记录日志信息
记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关A ...
- JSON(及其在ajax前后端交互的过程)小识
一. json介绍 json是一种轻量级的数据交换格式,规则很简单: 并列的数据之间用逗号(,)分隔: 映射用冒号(:)表示: 并列数据的集合(数组)用方括号([])表示: 映射的集合(对象)用大括号 ...
- ashx中Response.ContentType的常用类型
ashx中Response.ContentType的常用类型: text/plaintext/htmltext/xmlapplication/jsonimage/GIFapplication/x-cd ...
- 解决Asp.net Mvc中使用异步的时候HttpContext.Current为null的方法
在项目中使用异步(async await)的时候发现一个现象,HttpContext.Current为null,导致一系列的问题. 上网查了一些资料后找到了一个对象: System.Threading ...
- 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新
在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...
- ASP.NET MVC5----了解我们使用的@HTML帮助类
20几岁,怕什么. 自己的感觉 说一个自己最近使用AngularJS的感受,我们之前使用mvc进行项目开发都是了解和经常使用HTML的帮助类,来完成我们前端大部分代码的编写,其实在我没有接触Angul ...
- C# ListView点击列头进行排序
/// <summary> /// This class is an implementation of the 'IComparer' interface. /// </summa ...
- 『.NET Core CLI工具文档』(九)dotnet-run
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-run 翻译:dotnet-run 名称 dotnet-run -- 没有任何明确的编译或启动命令运行&q ...