ud_upload.jsp

    <s:form action="fileupload" enctype="multipart/form-data">
<s:textfield label="照片描述" name="desc"></s:textfield>
<s:file label="文件1" name="file1"></s:file>
<s:submit value="上传"></s:submit>
</s:form>

ud_download.jsp

    <s:url var="temp1" action="filedownload" ></s:url>
<s:a href="%{temp1}" >下载bload.png</s:a>

struts.xml

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" />
<constant name="struts.configuration.xml.reload" value="true" />
<constant name="struts.custom.i18n.resources" value="messageResource" />
<package name="p1" namespace="/" extends="struts-default">
<action name="fileupload" class="org.ah.s2.C1" method="fileupload">
<!-- 上传需要(自带)拦截器,传入参数 -->
<interceptor-ref name="fileUpload">
<!-- 定义允许上传的类型 -->
<param name="allowedTypes">image/jpeg,image/png</param>
<!-- 文件大小,单位:byte,不能用乘法计算,只能写最终数字 -->
<!-- 35k -->
<param name="maximumSize">35850</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result name="success" type="dispatcher">
/ud_download.jsp
</result>
<!-- 文件被过滤掉,将返回input -->
<result name="input">/ud_upload.jsp</result>
</action> <action name="filedownload" class="org.ah.s2.C1" method="filedownload">
<!-- 只有一个result子元素,不用name -->
<result type="stream">
<param name="contentType">image/png</param>
<!-- fileName对应下载后的文件名,这里就用Action中的变量了 -->
<param name="contentDisposition">attachment;fileName=${downLoadAh}</param>
<param name="inputName">inputStream</param>
</result>
</action>
</package>
</struts>
image/jpeg,不是jpg!
如果上传的文件不符合指定的要求,会回显错误信息。这些错误信息基于i18n,存放在struts-messages.properties配置文件中,所以需要配置struts.custom.i18n.resources

Action:

package org.ah.s2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport; public class C1 extends ActionSupport {
private String desc;// 描述
private File file1;// 上传文件。java.io // 以下变量直接可得,文件名file1+固定后缀,都需要getter setter方法
private String file1FileName;// 上传文件名
private String file1ContentType;// 上传文件类型 public String getDesc() {
return desc;
} public void setDesc(String desc) {
this.desc = desc;
} public File getFile1() {
return file1;
} public void setFile1(File file1) {
this.file1 = file1;
} public String getFile1FileName() {
return file1FileName;
} public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
} public String getFile1ContentType() {
return file1ContentType;
} public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
} /**
* 文件上传
*
* @return
* @throws IOException
*/
public String fileupload() throws IOException { // \t:制表符
System.out.println("File name:" + this.file1FileName + "\t"
+ "ContentType:" + this.file1ContentType + "\t" + "描述:"
+ this.desc); // 文件拷贝
FileInputStream fis = new FileInputStream(this.file1); FileOutputStream fos = new FileOutputStream("D:\\fileupload\\"
+ this.file1FileName); byte[] bs = new byte[1024];
int real = fis.read(bs);
while (real > 0) {
fos.write(bs, 0, real);
real = fis.read(bs);
} fos.close();
fis.close(); return Action.SUCCESS;
} // -------------------------------------------------- // 下载时默认名称,只需getter方法即可
private String downLoadAh;
public String getDownLoadAh() {
return downLoadAh;
} /**
* 文件下载
* @return
*/
public String filedownload() {
downLoadAh = "border_1.png";
return Action.SUCCESS;
} // 用于下载的文件输入流
   // 对应:<param name="inputName">inputStream</param>
public InputStream getInputStream() {
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("D:\\fileupload\\"
+ downLoadAh));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return fis;
}
}

messageResource.properties

struts.messages.error.file.too.large=\u6587\u4EF6\u592A\u5927
struts.messages.error.file.extension.not.allowed=\u6587\u4EF6\u7C7B\u578B\u4E0D\u5339\u914D
struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u7C7B\u578B\u4E0D\u6B63\u786E

Struts2:上传下载的更多相关文章

  1. struts2上传下载

    struts上传下载必须引入两个jar文件: commons-fileupload-x.x.x.jar和comons-io-x.x.x.jar上传文件 import java.io.BufferedI ...

  2. struts2 上传下载文件,异常处理,数据类型转换

    一,web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...

  3. Struts2 上传下载

    一. 1.文件上传是web应用经常用到的一个知识.原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数 据以二进制编码的方式提交,在接收此请求的Se ...

  4. Struts2实现文件上传下载功能(批量上传)

    今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...

  5. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  6. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  7. Struts2 文件上传,下载,删除

    本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用Fi ...

  8. struts2.1.6教程九、文件上传下载(了解)

    首先建立struts2UpDownLoad项目,搭建好struts2基本的开发环境. 上传实例 步骤一:upload.jsp代码如下: <s:form action="upload&q ...

  9. Struts2学习(三)上传下载

    今天记录一下利用struts2实现上传下载,借此案例说明一下struts2的开发流程. 须要注意的是struts2版本号不同非常多地方的写法是不同的.本例使用struts2.3.15 .有差别的地方文 ...

  10. Struts2配合layui多文件上传--下载

    先说上传: 前台上传文件的js代码: var demoListView = $('#demoList') ,uploadListIns = upload.render({ elem: '#testLi ...

随机推荐

  1. JavaScript 立即执行函数

    js中(function(){…})()立即执行函数写法理解 javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法 ...

  2. CGGeometry类定义几何元素的结构和操作几何元素的函数。

    1.数据类型: CGFloat: 浮点值的基本类型CGPoint: 表示一个二维坐标系中的点CGSize: 表示一个矩形的宽度和高度CGRect: 表示一个矩形的位置和大小 typedef float ...

  3. 关于Java的基本类型

    Java的基本类型分为整数型,浮点型,字符型,布尔型.顾名思义整数型用来表示整数,浮点型用来表示带小数的数,字符型用来表示字符.特殊的是布尔型用来表示逻辑上的true(真)和false(假),一般与分 ...

  4. android 底层入门开发(二)

    LED将为我闪烁:控制发光二极管 对于大多数Linux驱动来说,需要直接与硬件交互,本章主要介绍用Linux驱动来控制二极管的明暗,即通过Linux驱动发送数据控制开发板上LED灯的开关. 第一节介绍 ...

  5. Poco C++ MySQl demo

    #include "Poco/Exception.h"#include "Poco/Data/Session.h"#include "Poco/Dat ...

  6. google搜索技巧

    说明:‘’是为了突出,不属于搜索表达式的一部分 —————————————————————— 1.空格 空格代表和 例如 复旦 社会学 搜索结果网页同时包含这两个关键字. 2.‘-’ ’-‘代表排除某 ...

  7. [stat.simulation] Hasting-Metropolis Algorithm

    问题背景:我们有一些观测数据X,这些数据假设是取值为1,...,m:我们还知道每个数据观测到的频数为: 但是我们现在无法计算B的大小.(这是一个假设,毕竟计算一串数字的和不是难事) 问题: 我们需要通 ...

  8. CSS定位类型

    在CSS里面布局是相当重要的,二在这一周了,学习了一些定位,很少用到,用了更好的方式浮动.BFC.IFC等去解决问题. 而也我也对定位的概念不那么熟练运用. 初步的定位类型 1.静态定位(static ...

  9. 怎么用BarTender的格式刷

    BarTender的新格式刷使您能够轻松地在模板上的多个对象之间共享格式.您可以在单个模板中以及在多个BarTender模板和文档之间复制对象样式.下面小编给大家来讲讲BarTender格式刷这一可用 ...

  10. SDDC-SDN-SDS

    SDDCSDNSDS软件定义存储是一个较大的行业发展趋势,这个行业还包括软件定义网络(SDN)和软件定义数据中心(SDDC). SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切 ...