Struts2学习笔记(十一)——文件上传
1、单文件上传
单文件上传步骤:
1)创建上传jsp页面
文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded,比如:
<form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
2)创建处理文件上传Action类
- 在Action类中声明相关属性:
- 要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型,该属性用来保存临时文件;
- 要声明[同名的属性]ContentType属性,类型是String类型,该属性表示上传文件的类型;
- 要声明[同名的属性]FileName属性,类型是String类型,该文件表示要上传的文件;
- 给所有属性提供get和set方法。
- 在Action类中提供处理上传的方法:
- 获取要保存文件的位置;
- 在目标文件夹内,创建一个与上传文件同名的文件;
- 通过FileUtils工具类提供copyFile()方法,将临时文件内容拷贝到目标文件夹下的那个同名的文件;
- 调用保存临时文件的属性的delete()方法删除临时文件(也就是File类型属性的delete方法)。
3)配置struts.xml文件
- 设置上传文件大小,Struts2默认上传文件总大小为2MB,超过文件总大小,跳转input视图,通过<s:actionError /> 回显错误信息,在struts.xml 设置上传总大小:
<constant name="struts.multipart.maxSize" value="20000000"></constant>
设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性
- 在fileUpload拦截器中有三个属性:
- protected Long maximumSize:可以设置每一个上传文件的大小
- protected Set<String> allowedTypesSet:设置允许上传文件的类型
- protected Set<String> allowedExtensionsSet:设置允许的上传文件的后缀名
可以在struts.xml文件中配置这些属性:
<interceptor-ref name="defaultStack">
<!--配置上传文件的大小,这里配置的是上传文件的单个大小-->
<param name="fileUpload.maximumSize">20971520</param>
<!-- 配置上传文件允许的类型-->
<param name="fileUpload.allowedTypes">text/plain,application/msword</param>
<!-- 配置上传文件的扩展名-->
<param name="fileUpload.allowedExtensions">.txt,.doc</param>
</interceptor-ref>
允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致。
单文件上传示例:
1)创建jsp页面
<body>
<form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
上传文件:<input type="file" name="upload">
<input type="submit" value="上传">
</form>
</body>
2)创建Action类
public class UploadAction extends ActionSupport {
private File upload;
private String uploadContentType;
private String uploadFileName;
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
@Override
public String execute() throws Exception {
ServletContext sc = ServletActionContext.getServletContext();
//获取要保存文件的位置
String path = sc.getRealPath("/upload");
//创建一个与上传文件同名的文件
File file = new File(path, uploadFileName);
//将临时文件内容拷贝到目标文件夹下的那个同名的文件
FileUtils.copyFile(upload, file);
//删除临时文件
upload.delete();
return SUCCESS;
}
}
3)配置struts.xml文件
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.maxSize" value="200000000"/>
<package name="default" namespace="/" extends="struts-default">
<action name="uploadAction" class="com.sunny.action.UploadAction">
<result>/success.jsp</result>
<result name="input">/error.jsp</result>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">20971520</param>
<param name="fileUpload.allowedTypes">text/plain,application/msword</param>
<param name="fileUpload.allowedExtensions">.txt,.doc</param>
</interceptor-ref>
</action>
</package>
</struts>
4)上传文件界面

5)上传成功后会跳转到success.jsp页面

6)项目下的upload文件夹下会有上传的文件

上传问题信息国际化
Struts2上传问题信息默认的文件为在struts-message.properties下:
struts.messages.error.uploading=Error uploading: {0}
struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}
要想实现中文显示,需要在Action类相同文件下创建ActionClassName.properties文件,其中ActionClassName为上传Action类的类名,文件内容修改为:
struts.messages.error.uploading=上传错误: {0}
struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}
等号前面的内容固定,后面的内容可以自己写。
2、多文件上传
多文件上传的所有流程与单文件上传一致,但是需要注意的是:
- 在页面中,虽然是多文件上传,但是页面中表单的name属性的值必须保持一致;
- 在Action类中声明的相关属性,类型改成数组或者集合;
- 在业务方法中,相关处理流程改成单文件上传的循环。
单文件上传示例:
1)创建jsp页面
<body>
<form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">
上传文件:<input type="file" name="upload"><br>
上传文件:<input type="file" name="upload"><br>
上传文件:<input type="file" name="upload"><br>
上传文件:<input type="file" name="upload"><br>
<input type="submit" value="上传">
</form>
</body>
2)创建Action类
public class UploadAction extends ActionSupport {
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
@Override
public String execute() throws Exception {
ServletContext sc = ServletActionContext.getServletContext();
//获取要保存文件的位置
String path = sc.getRealPath("/upload");
//创建一个与上传文件同名的文件
for (int i = 0; i < upload.length; i++) {
File file = new File(path, uploadFileName[i]);
//将临时文件内容拷贝到目标文件夹下的那个同名的文件
FileUtils.copyFile(upload[i], file);
//删除临时文件
upload[i].delete();
}
return SUCCESS;
}
}
3)配置struts.xml文件,和单文件上传的配置一样
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.maxSize" value="200000000"/>
<package name="default" namespace="/" extends="struts-default">
<action name="uploadAction" class="com.sunny.action.UploadAction">
<result>/success.jsp</result>
<result name="input">/error.jsp</result>
<interceptor-ref name="defaultStack">
<param name="fileUpload.maximumSize">20971520</param>
<param name="fileUpload.allowedTypes">text/plain,application/msword</param>
<param name="fileUpload.allowedExtensions">.txt,.doc</param>
</interceptor-ref>
</action>
</package>
</struts>
4)上传文件界面

5)上传成功后会跳转到success.jsp页面

6)项目下的upload文件夹下会有上传的文件

3、文件下载
Struts2学习笔记(十一)——文件上传的更多相关文章
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- Django:学习笔记(8)——文件上传
Django:学习笔记(8)——文件上传 文件上传前端处理 本模块使用到的前端Ajax库为Axio,其地址为GitHub官网. 关于文件上传 上传文件就是把客户端的文件发送给服务器端. 在常见情况(不 ...
- springmvc学习笔记--支持文件上传和阿里云OSS API简介
前言: Web开发中图片上传的功能很常见, 本篇博客来讲述下springmvc如何实现图片上传的功能. 主要讲述依赖包引入, 配置项, 本地存储和云存储方案(阿里云的OSS服务). 铺垫: 文件上传是 ...
- Javaweb学习笔记10—文件上传与下载
今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ...
- go web 第二天 学习笔记之文件上传
package main import ( "crypto/md5" "fmt" "html/template" "io" ...
- SpringMVC学习笔记八:文件上传及多个文件上传
SpringMVC实现文件上传需要加入jar包,commons-fileupload-1.3.1.jar,commons-io-2.2.jar 项目目录树: pom.xml加入需要的包 <pro ...
- Laravel 学习笔记之文件上传
自定义添加磁盘——upload 位置:config/filesystems.php 'disks' => [ 'local' => [ 'driver' => 'local', 'r ...
- java学习笔记 (6) —— 文件上传
1.新建upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...
- django学习笔记 多文件上传
习惯了flask 再用django 还是不太习惯 好麻烦 配置文件也忒多了 不过还是要学的 之前只能一个一个文件长传,这次试试多个文件 不适用django的forms创建表单 直接在html中使用 ...
随机推荐
- JavaScript 的 作用域
在看了几本书之后的一些理解和自己的想法. 作用域,变量的作用范围 在ES6之前 变量的声明 只有var可以声明变量属于某个作用域,并且,也只有全局作用域和函数作用域. (没有var声明的变 ...
- Mac终端查看sqlite3数据库、表数据等
背景: 我们在用FMDB处理iOS数据库时,沙盒里保存的数据库格式为.sqlite3. 当我们需要在模拟器上调试或查看数据库内容时,我们可以直接在终端里查看到. 正文: 1.在沙盒路径找到需要查看到文 ...
- JS - 讨论 - 编码习惯 - JavaScript代码到底要不要写分号?
如题:烦请大家在评论区给出原创意见!多谢!
- 西电2017ACM网络赛
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define ms(a,x) memset(a,x, ...
- ARM开发(3)基于STM32的矩阵键盘控制蜂鸣器
一 矩阵键盘控制蜂鸣器原理: 1.1 本实验实现8*7矩阵键盘上按键控制蜂鸣器响. 1.2 实验思路:根据电路图原理,找出矩阵键盘行列所对应的引脚,赋予对应的按键值,然后控制蜂鸣器响. 1.3 ...
- Java 9 揭秘(17. Reactive Streams)
Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: 什么是流(stream) 响应式流(Reactive Streams)的倡议是什么,以及规范和Java API 响应式流在JDK 中的AP ...
- 数据结构基础:栈(Stack)
什么是栈? 栈是限制插入和删除只能在同一个位置上进行的表,这个位置就是栈的顶端,对于栈的操作主要有三种形式:入栈(将元素插入到表中),出栈(将表最后的元素删除,也就是栈顶的元素),返回栈顶元素 ...
- Md5的加密 java实现
百度百科对MD5的说明是: Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护. MD5即Mess ...
- 小白读iOS冗余资源扫描脚本
随着公司项目的不断功能迭代,项目的体积越来越大,各种瘦身策略迫在眉睫.由于平时使用Linux高级命令和 shell脚本的机会不多,之前学的知识一下子想起来很难.所有趁着这次看脚本,重新温习一下. 本文 ...
- 抓取60000+QQ空间说说做一次数据分析
对于QQ空间的数据一直来是垂涎不已,老早就想偷过来研究研究,这几天闲下来便开始动手... 整个程序的流程为:登录-->获取cookie-->获取所有的好友qq_number-->根据 ...