Struts的文件上传下载

1.文件上传

Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的。且是使用拦截器:<interceptor name="fileUpload" calss="org.apache.struts2.interceptor.FileUploadInterceptor/> 来完成的。

1.1.Struts完成文件上传的基本步骤

由于功能已经在拦截器就已经完成了,所以在action中就只需要进行配置就可以了,需要注意的是:在action的代码中File要和jsp表单中的name一致

jsp中的上传代码是:

<form action="${pageContext.request.contextPath}/fileUploadAction" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="userName"><br/>
文件:<input type="file" name="file1"><br/>
<input type="submit" value="上传">
</form>

action的处理程序,其实处理程序就是一个配置,因为写法是固定的:

package e_fileUpload;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import java.io.File; /**
* Struts实现上传并保存
*/
public class FileUpload extends ActionSupport{
//对应input表单的name
private File file1;
//文件名
private String file1FileName;
//文件的类型
private String file1ContentType; public void setFile1(File file1) {
this.file1 = file1;
} public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
} public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
} @Override
public String execute() throws Exception {
/*****拿到上传的文件,进行处理****/
//一、把文件上传到upload目录
//1.获取上传的目录路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
//2.创建目录文件对象
File destFile = new File(path, file1FileName);
//3.把上传的文件,拷贝到目标文件中
FileUtils.copyFile(file1,destFile);
return SUCCESS;
}
}

配置文件xml

    <package name="upload_" extends="struts-default" namespace="/">
<!--action的名称不能使用关键字“fileUpload"-->
<action name="fileUploadAction" class="e_fileUpload.FileUpload" >
<result name="success">/e/success.jsp</result> </action>
</package>

1.2.上传文件大小限制

Struts默认的上传文文件最大是2MB,如果需要修改,则需要在全局配置中修改常量maxSize:

    <!--修改文件上传最大为30M,只需要修改这个常量的值为30M-->
<constant name="struts.multipart.maxSize" value="31457280"/>

1.2.限制上传文件允许的类型

例如:只允许txt/jpg后缀的文件上传

思路:是拦截器中注入参数从而限制文件上传类型

方法是通过配置解决:

    <package name="upload_" extends="struts-default" namespace="/">
<!--action的名称不能使用关键字“fileUpload"-->
<action name="fileUploadAction" class="e_fileUpload.FileUpload" >
<!--限制运行上传的文件的类型,可以使用下面的两个方法都行,不可同时使用-->
<interceptor-ref name="defaultStack">
<!--1.限制运行的文件的扩展名,name是固定写法,txt,jpg可以自己填写 -->
<param name="fileUpload.allowedExtensions">txt,jpg</param>
<!--2.限制允许的类型,如果根上面同时用,回去两者的交集-->
<param name="fileUpload.allowedTypes">text/plain</param>
</interceptor-ref>
<result name="success">/e/success.jsp</result>
<!--配置错误视图-->
<result name="input">/e/error.jsp</result>
</action>
</package>

1.3.input错误提示

当文件上传出错误时候,Struts内部会返回input视图(错误视图),所以就需要我们在struts.xml配置input视图来转向错误页面

具体的配置方法只需要在配置中增加一个,例如:

        <action name="fileUploadAction" class="e_fileUpload.FileUpload" >
<result name="success">/e/success.jsp</result>
<!--配置错误视图-->
<result name="input">/e/error.jsp</result>
</action>

在错误页面error.jsp中,如果向要显示错误信息,可以按照下面的方式显示,这是使用标签的方法:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
error页面<br/>
<%--查看struts框架在运行时期产生的所有错误信息--%>
<%@taglib prefix="s" uri="/struts-tags" %>
<s:fielderror></s:fielderror>
</body>
</html>

2.Struts中的文件下载

在Struts中文件下载有两种方式。

2.1.普通方式

通过response对象向浏览器写入字节流数据。设置下载的响应头

2.2.方式2:Struts方式

Struts的需要在Struts.xml的配置文件配置参数,但是下载和上传一样,都是程序化的代码,下次用的时候直接copy就可以了。

效果图如下:

代码实现如下:

首先是jsp页面的下载列表页面:

<%--
Created by IntelliJ IDEA.
User: cenyu
Date: 16-12-25
Time: 下午3:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>list</title>
</head>
<body>
<table border="1" align="center">
<tr>
<td>编号</td>
<td>文件名</td>
<td>操作</td>
</tr>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach var="fileName" items="${fileNames}" varStatus="vs">
<tr>
<td>${vs.count}</td>
<td>${fileName}</td>
<td>
<%--构建一个url--%>
<c:url var="url" value="down_down">
<c:param name="fileName" value="${fileName}"></c:param>
</c:url>
<a href="${url}">下载</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>

action的处理类,提供列表展示和下载两种方法,考虑到中文名,都做了中文编码处理:

package e_fileUpload;

import com.opensymphony.xwork2.ActionContext;
import org.apache.struts2.ServletActionContext; import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map; /**
*文件下载:
* 1.显示所有要下载文件的列表
* 2.文件下载
*/
public class DownAction {
/*********1.显示所有要下载的文件列表************/
public String list() throws Exception{
//得到upload目录的路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
//目录对象
File file = new File(path);
//得到所有要下载的文件的文集名
String[] fileNames = file.list();
//保存
ActionContext ac = ActionContext.getContext();
//得到代表request的map(第二种方式)
Map<String,Object> request = (Map<String, Object>) ac.get("request");
request.put("fileNames",fileNames);
return "list";
} /****************2.文件下载*********************/
//1.获取要下载的文件的文件名
private String fileName; public void setFileName(String fileName) {
//处理传入的参数的中文问题(get提交)
try {
fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
//把处理好的文件名,赋值
this.fileName = fileName;
} //2.下载提交的业务方法(在Struts.xml中配置返回stream),此处不用写代码
public String down() throws Exception{
return "download";
} //3.返回文件流的方法
public InputStream getAttrInputStream(){
InputStream stream = ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
if (stream==null){
System.out.println("getAttrInputStream()返回null");
}
return stream ;
} //4.下载显示的文件名(浏览器显示的文件名)
public String getDownFileName(){
//需要进行中文编码
try {
fileName = URLEncoder.encode(fileName,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
} return fileName;
}
}

然后要注意的是在下载处理中的xml配置

<action name="down_*" class="e_fileUpload.DownAction" method="{1}">
<!--列表展示-->
<result name="list">/e/list.jsp</result>
<!--下载操作-->
<result name="download" type="stream">
<!--调用action返回流的方法-->
<!--允许下载的文件类型,现指定为所有的二进制文件类型-->
<param name="contentType">application/octet-stream</param>
<!--对应的是action中属性,返回流的属性,其实就是:getAttrInputStream()-->
<param name="inputName">attrInputStream</param>
<!--下载头,包括:浏览器显示的文件名-->
<param name="contentDisposition">attachment;filename=${downFileName}</param>
<!--缓冲区大小设置-->
<param name="bufferSize">1024</param>
</result>
</action>

Struts的文件上传下载的更多相关文章

  1. Struts:文件上传下载

  2. Struts 框架 之 文件上传下载案例

    Struts 框架 文件上传 1. 先准备 Struts 环境 (我使用的是struts 2.3.4版本) 导jar包:

  3. ssh框架文件上传下载

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Struts2之文件上传下载

    本篇文章主要介绍如何利用struts2进行文件的上传及下载,同时给出我在编写同时所遇到的一些问题的解决方案. 文件上传 前端页面 <!-- 引入struts标签 --> <%@tag ...

  5. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

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

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

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

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

  8. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  9. Struts2 控制文件上传下载

    之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Strut ...

随机推荐

  1. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  2. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  3. jQuery的61种选择器

    The Write Less , Do More ! jQuery选择器 1. #id : 根据给定的ID匹配一个元素 <p id="myId">这是第一个p标签< ...

  4. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  5. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论

    异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#signalR 后台创建了一个DntHub的集线器 前台在调用的时候出现了问题(经检查是代理对象 ...

  6. 清空Github上某个文件的历史版本

    title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...

  7. 运用php做投票题,例题

    要求大概是这样的,有一个题目,题目下面是复选框,要求点完复选框提交后会变成进度条,各选项的进度条百分比,和投票数量 首先还是要在数据库建两张表,如下: 要完成这个题目,需要建两个页面 <!DOC ...

  8. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  9. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  10. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...