Struts2文件上传与下载

1.1.1新建一个Maven项目(demo02)

在此添加Web构面以及 struts2 构面

1.2.1配置Maven依赖(pom.xml 文件)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>org.nf</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>demo02</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
</project> 

1.2.2 项目中pom文件所继承的父文件(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <artifactId>parent</artifactId>
<groupId>org.nf</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<!-- 设置整个maven项目的编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 设置控制台输出参数的编码格式, 解决乱码 -->
<orgLine>-Dfile.encoding=UTF-8</orgLine>
</properties> <build>
<plugins>
<!-- 配置maven编译插件,指定maven编译版本 -->
<plugin>
<!-- 插件名称 -->
<artifactId>maven-compiler-plugin</artifactId>
<!-- 插件配置信息 -->
<configuration>
<target>1.8</target>
<source>1.8</source>
<encoding>UTF-8</encoding>
</configuration>
</plugin> <plugin>
<!-- 插件名称 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<warSourceDirectory>web</warSourceDirectory>
<webXml>web\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
</plugins>
</build> <!-- 添加Struts依赖 -->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency> <dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.8</version>
</dependency> <dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.8</version>
</dependency>
</dependencies>
</project>

1.2.3所添加好的依赖jar包如下:

1.3.1编写上传文件页面(upload.jsp)

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
Created by IntelliJ IDEA.
User: YongLin
Date: 2017/2/9
Time: 下午2:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Upload</title>
</head>
<body> <!--方式一: 使用struts错误信息提示的标签,会自动输出错误信息 -->
<s:fielderror cssStyle="color: red"/> <!--方式二: 使用el表达式来获取错误信息,uploadFile对应input的name,它是一个数组
当多文件上传时,应该循环遍历这个数组来显示提示信息的内容-->
<%--<font color="red">${fieldErrors.uploadFile[0]}</font>--%>
<form method="post" action="upload" enctype="multipart/form-data">
File:<input type="file" name="uploadFile"/><br/>
Readme:<input type="text" name="readme"/><br/>
<input type="submit" value="submit"/>
</form>
</body>
</html>

运行效果:

1.4.1struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd"> <struts>
<!-- 设置编码格式,防止上传的文件名为中文时是乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 指定resource资源文件的名称-->
<constant name="struts.custom.i18n.resources" value="message"/>
<!-- 设置上传文件的总大小(单位:字节),默认是10M -->
<constant name="struts.multipart.maxSize" value="104857600"/> <package name="struts" extends="struts-default,json-default">
<!-- 配置上传的拦截器 -->
<interceptors>
<interceptor-stack name="myStack">
<!-- 配置上传的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 限制上传的文件类型,这里限制为只能上传各种图片类型 -->
<!--<param name="allowedTypes">image/bmp,image/png,image/jpg,image/jpeg</param>-->
<!-- 限制上传文件的大小(单位是字节)-->
<!--<param name="maximumSize">2097152</param>-->
</interceptor-ref>
<!-- 引用默认的拦截器栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors> <!-- 普通上传 -->
<action name="upload" class="org.demo02.action.DemoAction" method="upload">
<!-- 引用拦截器 -->
<interceptor-ref name="myStack"/>
<!-- 上传成功后跳转的页面 -->
<result>index.jsp</result> <!-- 上传失败或有错误的提示页面,
name="input"表示当有错误信息的时候要跳转到的提示页面-->
<result name="input">upload.jsp</result>
</action> <!-- ajax上传,后台的上传方法是一样的,不同的是result的配置 -->
<action name="ajaxUpload" class="org.demo02.action.DemoAction" method="upload">
<!-- 引用拦截器 -->
<interceptor-ref name="myStack"/>
<result type="json">
<param name="root">message</param>
</result>
<!-- 使用json结果集类型返回错误信息,用于ajax请求
struts会将fieldErrors序列化成json对象 -->
<result name="input" type="json">
<param name="root">fieldErrors</param>
</result>
</action> <!-- 文件下载 -->
<action name="download" class="org.demo02.action.DownloadAction" method="download">
<!-- 文件下载的结果集类型使用stream,表示一个流 -->
<result type="stream">
<!-- 设置一些下载的参数配置 -->
<!-- contentType表示设置response的响应类型,这里设置为流类型 -->
<param name="contentType">application/octet-stream</param>
<!-- contentDisposition指定响应回客户端的下载的文件名,
${fileName}引用action中定义的fileName属性-->
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<!-- inputName指定action中定义的getXxx方法,去掉get并将首字母改成小写 -->
<param name="inputName">inputStream</param>
<!-- 下载文件的缓冲大小(可选) -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>

1.4.2 显示错误信息中文提示的:message.properties

    struts.messages.error.content.type.not.allowed = 不是允许的上传类型
struts.messages.error.file.too.large = 已超出文件的限制大小

1.4.3文件上传的action:DemoAction

package org.demo02.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; import java.io.File;
import java.io.IOException; /**
* Created by YongLin on 17/2/9.
*/
public class DemoAction extends ActionSupport {
//表单文本数据
private String readme; //表单文件,必须是一个File类型
private File uploadFile;
//上传的文件名,格式必须是File名称 + FileName
private String uploadFileFileName;
//上传的文件类型,格式必须是File名称 + ContentType
private String uploadFileContentType; private String message; public String getReadme() {
return readme;
} public void setReadme(String readme) {
this.readme = readme;
} public File getUploadFile() {
return uploadFile;
} public void setUploadFile(File uploadFile) {
this.uploadFile = uploadFile;
} public String getUploadFileFileName() {
return uploadFileFileName;
} public void setUploadFileFileName(String uploadFileFileName) {
this.uploadFileFileName = uploadFileFileName;
} public String getUploadFileContentType() {
return uploadFileContentType;
} public void setUploadFileContentType(String uploadFileContentType) {
this.uploadFileContentType = uploadFileContentType;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} //上传
public String upload() throws IOException {
//获取上传的绝对路径
String uploadPath = ServletActionContext.getServletContext().getRealPath("/files");
//如果提交过来的File不为null,才执行上传操作
if(uploadFile != null){
System.out.println(uploadFileFileName);
System.out.println(uploadFileContentType);
//根据文件名以及上传的路径构建一个新的File对象
File saveFile = new File(uploadPath, uploadFileFileName);
//先判断上传的目录是否存在,如果不存在则创建出来
if(!saveFile.getParentFile().exists()){
saveFile.getParentFile().mkdirs();
}
//使用文件复制执行上传
FileUtils.copyFile(uploadFile, saveFile);
//提示成功信息
message = "上传成功";
}
return "success";
}
}

1.4.4 文件下载的action:DownloadAction

package org.demo02.action;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext; import java.io.*; /**
* Created by YongLin on 17/2/10.
*/
public class DownloadAction extends ActionSupport { //要下载的文件名
private String fileName; public String getFileName() {
//解决下载文件时中文名时出现乱码
try {
fileName = new String(fileName.getBytes("utf-8"),
"ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
} //我们需要提供一个方法,这个方法是一个标准的get方法,如getXxx
//并通过这个方法创建并返回一个InputStream给struts
//struts就会根据这个输入流读取文件,并写回客户端
public InputStream getInputStream() throws Exception {
//获取文件上传的目录
String uploadPath = ServletActionContext.getServletContext().getRealPath("/files");
//根据路径结合提交过来的文件名,创建一个File对象
File file = new File(uploadPath, fileName);
//创建InputStream对象
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
//返回这个输入流给struts
return inputStream;
} public String download(){
return "success";
} }
1.4.5Web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <filter>
<filter-name>dispatcher</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>dispatcher</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

1.5.1index.jsp页面

<%--
Created by IntelliJ IDEA.
User: YongLin
Date: 2017/2/9
Time: 下午2:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Index</title>
</head>
<body>
<!-- 显示文件名,并可以执行下载操作 -->
<a href="download?fileName=<s:property value='uploadFileFileName'/>"><s:property value="uploadFileFileName"/></a>
</body>
</html>

1.5.2Ajax 文件上传(需要引入jQery包)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-1.9.1.min.js"></script>
<script>
$(function(){
$("#btn").on("click",function(){
//使用FormData来实现表单的封装和ajax上传
var formData = new FormData(document.getElementById("f1"));
//使用jquery的ajax提交表单
$.ajax({
url : "ajaxUpload", //请求的url
type : "post", //请求类型
data : formData, //表单数据
processData : false, //让Jquery不处理发送的数据
contentType : false, //让Jquery不设置Content-Type请求头
success : function(result){ // 成功响应后的回调函数
if(result.uploadFile != undefined){
$("#msg").append("<font color='red'>"+result.uploadFile+"</font>");
}else{
$("#msg").append("<font color='red'>"+result+"</font>");
}
}
});
});
});
</script>
</head>
<body>
<div id="msg"></div>
<form id="f1" method="post" action="upload" enctype="multipart/form-data">
File:<input type="file" name="uploadFile"/><br/>
Readme:<input type="text" name="readme"/><br/>
<input id="btn" type="button" value="button"/>
</form>
</body>
</html>

1.6.1运行效果:

1.

点击提交  文件上传成功过后来到index.jsp页面

在页面中显示出文件名

2.

3.

4.Ajax文件上传

1.7.1Demo整体架构

1.8实例下载

Struts2学习总结——文件上传与下载的更多相关文章

  1. Struts2 之 实现文件上传和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  2. JavaWeb学习总结——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  3. javaWeb学习总结——文件上传、下载

    目录 1.文件上传环境搭建 2.文件上传代码实现 3.关于下载 @ 嘿,熊dei,你不得不知道在Web开发中,文件上传和下载功能是非常常用的功能,关于文件上传,浏览器上传[文件以流的形式传输]--&g ...

  4. struts2中的文件上传和下载

    天下大事,必做于细.天下难事,必作于易. 以前见过某些人,基础的知识还不扎实就去学习更难的事,这样必定在学习新的知识会非常迷惑结果 再回来又一次学习一下没有搞懂的知识,这必定会导致学习效率的下降!我写 ...

  5. 4.struts2中的文件上传,下载

    Struts2中文件的上传下载,是借用commons里面的包实现文件的上传,需要导入两个jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 实现 ...

  6. 1.6(Spring MVC学习笔记)文件上传与下载

    一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...

  7. 16.Django学习之文件上传和下载

    上传就这么六步! 一. settings配置文件中配置 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'medias').repl ...

  8. Struts2 之 实现文件上传(多文件)和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  9. 【SSH2(实用文章)】--Struts2文件上传和下载的例子

    回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法.映射机制及其在深入分析.最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上 ...

随机推荐

  1. H5上滑跳转页面

    方法一: jquery方法 movePage($('body')); function movePage(dom) { var startY, moveY, moveSpave; dom.on(&qu ...

  2. HTML是什么与基础格式

    html 又称 超文本标记语言. 网页的本质其实就是html代码,通过浏览器,将html转换翻译成用户可以看得懂的展现丰富的页面. 所以制作网站的本质,其实就是编写html代码. HTML基础格式 & ...

  3. npm(cnpm)介绍(安装gulp)

    1.npm(node package manager) nodejs的包管理器,用于node插件管理(安装.卸载.更新.管理依赖等); 2.使用npm安装安装插件: 1).命令提示符执行 npm in ...

  4. BZOJ3600:没有人的算术

    传送门 如果能给每个 \(pair\) 按照权值编号就好了 假设之前已经有了所有的权值的编号,现在考虑编号新的 \(pair\) 如果看过了陈立杰的论文的话,不难得到一个重量平衡树的做法 给树上每个子 ...

  5. web第一章(html)

    HTML介绍 HyperText(超文本) Markup(标记) Language(语音) 类似于XML都是由标签组成 xml:是可扩展标记语言,标签可以任意自定义 HTML:不可以使用任意标签,学习 ...

  6. 项目经验:GIS<MapWinGIS>建模第二天

    记录下GIS的进展情况

  7. v-model实现

    v-model就是输入的值实时显示的目的,如果纯粹写登录页面的form控件没有实时显示的需求 就不用绑定v-model.

  8. LoadRunner简单培训相关笔记

    学校花了20万买了LoadRunner,因此作为幸运的一届,赶上了这场培训.以下为笔记以及培训后制作的简易思维导图. Loadrunner思维导图源码(Xmind): http://pan.baidu ...

  9. Azure 中部署Gitlab的方法

    一.Azure 中创建Gitlab虚拟机(1).登陆Azure:打开Azure 官网,点击右侧上方的登陆Azure门户,输入Azure帐号与密码,点击 登陆 . (2).创建Gitlab虚拟机:登陆A ...

  10. ionic项目编译打包(android平台)

    ionic项目相关开发工作完成之后(建立ionic工程项目可以参考上一篇文章ionic项目工程建立),就可以进行项目的编译打包apk应用包. 打包编译需要在平台环境下,这里只记录下android平台打 ...