struts2实现文件上传、多文件上传和文件下载
总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格:
第一:上传的时候
private File file;
private String fileContentType;
private String fileFileName;
属性的红色部分必须有可以随意起,但不能省略。
第二:下载的时候属性名不能随意起。
实现文件上传:可以找到WEB-INF\lib\struts2-core-2.3.16.3.jar下的struts-default.xml里的拦截器标签下的name=fileUpload的实体类alt+shift+t进去源代码(前提是关联好jar包),看看
我的上传Action:
package cn.jbit.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
//Action中使用了3个属性来封装文件信息
//1:File类型的xxx属性:与表单中的File控件的name属性一致,用于封装File控件对应的文件内容
//2:String类型的xxxFileName属性和3:String类型的xxxContentType属性,这两个属性的固定语法是
//File类型的属性名+后缀FileName|ContentType组合成最终:xxxFileName,xxxContentType
//如果不按固定语法写的话,可能会造成文件名和文件类型读取不到的情况,最终写入的文件是一个
//名字为:null,并且没有类型格式的文件信息。(虽然手动改成.jpg也会显示) private File file;
private String fileContentType;
private String fileFileName;
@Override
public String execute() throws Exception {
//1024*1024=1M
byte[] buffer=new byte[1024*1024];
//表单里的file标签
InputStream fis=new FileInputStream(file);
//在WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址
String path=ServletActionContext.getServletContext().getRealPath("image");
path=path+"\\"+this.fileFileName;
System.out.println(path);
//最终把读到的二进制流都写入,真实地址下同名的文件里
OutputStream os=new FileOutputStream(path);
//OutputStream os=new FileOutputStream("E:\\upload\\"+this.fileFileName);
int len=0;
while((len=fis.read(buffer))>0){
os.write(buffer,0,len);
}
fis.close();
os.close();
return SUCCESS;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
}
上传完之后,切记就是此时如果你在WebRoot下右键打开image→MyEclipse→open in Explorer是找不到你上传的图片的,因为图片真实的存储地址是在项目部署的地方webapps里如:E:\Program Files (x86)\apache-tomcat-7.0.55\webapps\up\image而不是这个路径:E:\java2\upload2014年12月2日\WebRoot\image。
上传文件的表单:
<body>
<s:form action="upload" enctype="multipart/form-data" method="post">
<s:file name="file" label="选择文件"></s:file>
<s:submit value="上传"></s:submit>
</s:form>
</body>
成功后跳转的页面:
您所上传的文件是:<s:property value="fileFileName"/><br/>
文件类型:<s:property value="fileContentType"/><br/>。
上传多个文件的话:
我们在WEB-INF\lib\struts2-core-2.3.16.3.jar下的org.apache.struts2下的default.properties里搜索max能看到:
struts.multipart.maxSize=2097152
也就是struts2里给的默认上传大小是2M(上传多个文件总大小),那么我们可以在struts2.xml里面设置大点:
//20M
<constant name="struts.multipart.maxSize" value="20971520"/>
我的上传表单为:
<s:form action="upload" enctype="multipart/form-data" method="post">
<s:file name="files" label="选择文件"></s:file>
<s:file name="files" label="选择文件"></s:file>
<s:file name="files" label="选择文件"></s:file>
<s:file name="files" label="选择文件"></s:file>
<s:file name="files" label="选择文件"></s:file>
<s:file name="files" label="选择文件"></s:file>
<s:submit value="上传"></s:submit>
我的上传Action:
package cn.jbit.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private File[] files;
private String[] filesContentType;
private String[] filesFileName;
@Override
public String execute() throws Exception {
byte[] buffer=new byte[1024*1024];
files=getFiles();
for (int i = 0; i < files.length; i++) {
//表单里的file标签
InputStream fis=new FileInputStream(files[i]);
//在WebRoot目录下创建一个存放图片的文件夹,然后获取真实的地址
String path=ServletActionContext.getServletContext().getRealPath("image");
path=path+"\\"+this.filesFileName[i];
System.out.println(path);
//最终把读到的二进制流都写入,真实地址下同名的文件里
OutputStream os=new FileOutputStream(path);
int len=0;
while((len=fis.read(buffer))>0){
os.write(buffer,0,len);
}
fis.close();
os.close();
}
return SUCCESS;
}
public File[] getFiles() {
return files;
}
public void setFiles(File[] files) {
this.files = files;
}
public String[] getFilesContentType() {
return filesContentType;
}
public void setFilesContentType(String[] filesContentType) {
this.filesContentType = filesContentType;
}
public String[] getFilesFileName() {
return filesFileName;
}
public void setFilesFileName(String[] filesFileName) {
this.filesFileName = filesFileName;
}
}
实现文件下载:
我的Action:
package cn.jbit.action;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownAction extends ActionSupport {
//struts2对属性名的配置很严格,如果不正确是会报错的,我在这里犯了个错
//把private InputStream InputStream ;声明成了InputStream input;
//就给我报错说找不到inputStream,所以建议 //fileName,contentType,inputStream属性名不要自己随便起名。
对常用的属性名来说比如
//读取下载文件的目录
private String path;
//下载文件的文件名
private String fileName;
//下载文件的类型
private String contentType;
//读取下载文件的输入流
private InputStream inputStream;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public InputStream getInputStream() throws FileNotFoundException {
String paths=ServletActionContext.getServletContext().getRealPath(path);
return new BufferedInputStream(new FileInputStream(paths+"\\"+fileName));
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
我的struts.xml配置:
<action name="download" class="cn.jbit.action.FileDownAction" >
<param name="path">/image</param>
<result name="success" type="stream">
<!-- 找到发布服务器Tomcat下→conf→web.xml里有各种各样的mime类型 -->
<!-- mime:多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型 -->
<param name="contentType">image/jpeg</param>
<param name="fileName">input</param>
<param name="contentDisposition">
<!-- contentDisposition参数由两部分组成,前面的部分标识处理文件的形式,如attachment表示在下载时弹出对话框,提示用户保存或者直接打开该文件;
后一部分标识下载文件的文件名称,量部分之间以分号进行分割 -->
attachment;filename="${fileName}"
</param>
<!-- 设置 下载时缓存区的大小,由于是从服务器里下载,建议不要设置太大 -->
<param name="bufferSize">4096</param>
</result>
</action>
我的down.jsp:
<a href="download.action?fileName=Hydrangeas.jpg">点击此处下载文档</a>
struts2实现文件上传、多文件上传和文件下载的更多相关文章
- struts2实现文件上传(多文件上传)及下载
一.要实现文件上传,需在项目中添加两个jar文件 二.上传准备的页面 注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post &l ...
- 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 上传下载文件,异常处理,数据类型转换
一,web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...
- Struts2之文件上传(单文件/多文件)
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- struts2文件上传时获取上传文件的大小
利用struts2框架上传文件时,如果想要获取上传文件的大小可以利用下面的方式进行: FileInputStream ins = new FileInputStream(file); if (ins. ...
随机推荐
- 友盟微博分享Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_CTTelephonyNetworkInfo", referenced from: objc-class-ref in libWeiboSDK.a
一,分析过程 1.第一次看到这个问题,以为是缺少导入框架或缺少编译文件,导入了微博 sso 框架和编译文件后仍有问题. 2.上网搜了搜也就以上两方面的问题. 3.于是我又仔细看了一遍友盟的分享接口文档 ...
- 用css画出三角形【转】
看到有面试题里会有问到如何用css画出三角形 众所周知好多图形都可以拆分成三角形,所以说会了画三角形就可以画出很多有意思的形状 画出三角形的原理是调整border(边框)的四个方向的宽度,线条样式以及 ...
- OpenStack 二次开发环境和开发工具的选择
OpenStack网上安装教程很多,就不介绍安装了,OpenStack所有组件都安装完后,dashboard web里面进行一些操作,没有报错或提示权限问题,就可以直接下载pycharm或者eclip ...
- jquery插件之拖拽改变元素大小
该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...
- border-radius
- Daily Scrum 10.26
虽然是星期六,大家也没有丝毫懈怠,但由于其他各科也已经布置了相应的大作业,我们组投入在软工作业上的时间也是有一定限度的.由于这次任务较重,今日的完成量只有一部分,剩余的留为明天继续. 下表是今日完成工 ...
- JQuery 遍历子元素+ each函数的跳出+提取字符串中的数字
最近脑袋迷糊的如同一团浆糊,一直出错. HTML代码如下图,现在想实现的功能是根据Ajax请求,获取到具体的button,以更新其样式.由于Button较多,每个Button都设置id,没有意义,想通 ...
- winform连接ACCESS数据库
1.先建立一个名叫text.mdb的access数据库 2.他它复制到access中文件下. 3.在App_Code文件夹下建好封装语句,查询方法,连接语句,其中studentDA中的代码为: pri ...
- 关于 QRCode 的问题[C# 生成二维码固定大小]
一直在纠结了一天多的问题:就是为什么生成的二维码会随着内容多少的变化而变化大小,但是为什么网上做出来的二维码内容变化但是大小却没有变化?刚开始的时候我就一直围绕着是不是根据缩略图来做的,但是这个方法行 ...
- Html5 与 Html4 的区别
HTML5是HTML标准的下一个版本.虽然HTML5没有完全颠覆HTML4,但是它们也有一些不同.最新最全的HTML5-HTML4对比信息 请看http://dev.w3.org/html5/html ...