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中使用 ...
随机推荐
- [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树
Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...
- 标准IO: 文件的打开与关闭函数 fopen & fclose
(1) 流(stream)和文件(file) 流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为"流&quo ...
- MFC常见问题以及解决方法(2)_Cstring和string互相转换
MFC默认编码是unicode(自己改成多字符集是不行的),对话框中对字符串的处理都是宽字符,而且添加变量会默认是CString类型,当你代码中想用string但又遇到必须转为CString的情况,就 ...
- 如何给Ionic写一个cordova插件
写一个cordova插件 之前由javaWeb转html5开发,由于面临新技术,遂在适应的过程中极为挣扎,不过还好~,这个过程也极为短暂:现如今面临一些较为复杂的需求还会有一丝丝头痛,却没有一开始那么 ...
- 中国剩余定理(CRT)与欧拉函数[数论]
中国剩余定理 ——!x^n+y^n=z^n 想必大家都听过同余方程这种玩意,但是可能对于中国剩余定理有诸多不解,作为一个MOer&OIer,在此具体说明. 对于同余方程: x≡c1(mod m ...
- jacoco统计Android手工测试覆盖率并自动上报服务器
改进了几个点 1. 不用借助Instrumentation启动,正常启动即可: 2. 测试代码不用push到主分支,主分支代码拉到本地后用git apply patch方式合并覆盖率代码: 3. 测试 ...
- 初学 Python(十一)——切片
初学 Python(十一)--切片 初学 Python,主要整理一些学习到的知识点,这次是切片. #-*- coding:utf-8 -*- ''''' 切片 ''' L = ['name','age ...
- Python网络数据采集7-单元测试与Selenium自动化测试
Python网络数据采集7-单元测试与Selenium自动化测试 单元测试 Python中使用内置库unittest可完成单元测试.只要继承unittest.TestCase类,就可以实现下面的功能. ...
- Wamp之mysql密码故事
注:有时候修改mysql密码会出现如下状况:密码改了,但新密码就是进不进去. 原因大概是语法错误.例如: >update user set password='hooray' where use ...
- Python初学基础
初入坑Python,打算跟着沫凡小哥的学习视频打个基础,此篇文章做一些简单的学习记录,加油加油加油啦 沫凡小哥的学习网站:https://morvanzhou.github.io/tutorial ...