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中使用 ...
随机推荐
- Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...
- 把int型非负数转换为英文
数字转换为英文 输入为int型非负数,最大值为2^31 - 1 = 2 147 483 647 输出为String英文,最大输出为Two Billion One Hundred Forty Seven ...
- C#获取当前时间详解
[转]C#获取当前日期时间(转) http://blog.163.com/ljq086@126/blog/static/549639712010112921658843/ 我们可以通过使用DataT ...
- Carthage的安装和使用
为什么要使用Carthage CocoaPods是已存在很长时间的Cocoa依赖管理器, 那么为什么要创建Carthage呢? CoaoaPods是一套整体解决方案,我们在Podfile中指定好我们需 ...
- 一个Web 持续集成工作实践
一个web的持续基础实践: https://mp.weixin.qq.com/src=3×tamp=1494325174&ver=1&signature=wFVC0E ...
- 【grunt】grunt 基础学习
1. 干啥的呢? 项目打包管理,用处有 1)可用于压缩合并前端文件,包括css/js , 2)可用于管理发布文件与开发文件,3)可用于自动编译less 文件 2. 常用的东西有哪些呢? 常用的插件有 ...
- Hardcoded string XXX,&…
eclipse布局文件警告:Hardcoded string XXX, should use @string resource
- 50. leetcode 520. Detect Capital
520. Detect Capital Given a word, you need to judge whether the usage of capitals in it is right or ...
- 使用Node.js调用阿里云短信的发送以及接收
为了使用Node.js调用阿里云短信服务,我自己写了个npm包, 目前实现了: 使用Node.js调用阿里云短信服务,发送短信: 使用Node.js调用阿里云短信服务以及MNS服务,接收用户上行短信 ...
- 又见angular----步一步做一个angular4小项目
这两天看了看angular4的文档,发现他和angular1.X的差别真的是太大了,官方给出的那个管理英雄的Demo是一个非常好的入门项目,这里给出一个管理个人计划的小项目,从头至尾一步一步讲解如何去 ...