做过文件上传功能开发的人员都知道,对于文件上传需要设置表单类型 enctype="multipart/form-data"(Content Type为multipart/form-data)。后台获取form data需要根据form类型(fileItem.isFormField())去判断是否是文件类型,如果再有其他参数数据的话,获取参数就会非常麻烦。而Webx提供了一个很好的接口(ParserRequestContext),帮助我们实现文件上传和获取普通参数。而这个接口的实现依赖于<parser> - 解析参数和Upload,我们来看下官方文档对于<parser> - 解析参数和Upload服务的介绍:

基本配置

首先我们需要在Webx.xml里进行这样的配置:
<services:request-contexts xmlns="http://www.alibaba.com/schema/services/request-contexts">
<parser />
...
</services:request-contexts>
<services:upload sizeMax="5M" fileSizeMax="2M" />

绝大多数情况下,你只需要上面的配置就足够了 ── <parser>会自动解析所有类型的请求,包括:

  1. GET请求
  2. 普通的POST请求(Content Type:application/x-www-form-urlencoded)
  3. 可上传文件的POST请求(Content Type:multipart/form-data)

访问参数

访问参数的时候,你有两种选择:
  1. 通过HttpServletRequest接口访问参数
  2. 通过ParserRequestContext接口访问参数

HttpServletRequest接口访问参数

我们先说一下HttpServletRequest接口访问参数:

写法如下:

@Autowired
HttpServletRequest request;
...
String s = request.getParameter("myparam");

你只需要在你的Action处理类通过@Autowired注解注入就OK了,然后你可以像你习惯的获取参数的方式进行参数值的获取,不过你需要注意的是:你只是看来感觉和你之前用的HttpServletRequest没什么区别,其实它是经过Webx封装过的实现类,你需要特别注意的是:你没有办法像之前那样获取文件表单数据,因为它已经不支持了,其他的正常。如果你想获取文件表单数据怎么办呢?很简单,用ParserRequestContext。

ParserRequestContext访问参数

写法如下:

@Autowired
ParserRequestContext parser;
...
String s = parser.getParameters().getString("myparam");

ParRequestContext是一个比HttpServletRequest接口要方便非常非常的多的一个接口,至于方便在哪里,我们接下来说明:

1、 直接取得指定类型的参数,例如:直接取得int、boolean值等。

// myparam=true, myparam=false
parser.getParameters().getBoolean("myparam");
// myparam=123
parser.getParameters().getInt("myparam");

2、如果参数值未提供,或者值为空,则返回指定默认值。

parser.getParameters().getBoolean("myparam", false);
parser.getParameters().getString("myparam", "no_value");
parser.getParameters().getInt("myparam", -1);

3、最为方便的莫过于文件上传,你可以直接获取FileItem。

FileItem fileItem = parser.getParameters().getFileItem("myfile");
FileItem[] fileItems = parser.getParameters().getFileItems("myfile");

4、访问Cookie

parser.getCookies().getString("mycookie");

你需要注意的是:如果你的表单里既有普通的参数数据,又有文件上传的参数数据,你可以直接进行获取就行了,不用像之前那么麻烦的操作。下面问来看一个例子:

$page.setTitle("文件上传页面")
<script type="text/javascript">function doClick(){document.getElementsByName("fileUploadName")[0].value = document.getElementsByName("fileUpload")[0].value}
</script>
<p>文件上传页面</p>
<form action="" method="post" enctype="multipart/form-data">$csrfToken.hiddenField#set($group = $form.testRegister.defaultInstance)<input type="hidden" name="action" value="file_uploadAction"/><table><tr><td>姓名:</td><td><input type="text" id="userName" name="userName" value="$!userName" /></td></tr><tr><td>密码</td><td><input type="text" name="passWord" id="passWord" value="$!passWord"/></td></tr><tr><td>文件上传</td><td><input type="text" name="fileUploadName" value="$!fileUploadName" ><input type="file" name="fileUpload" οnchange="doClick()"/></td></tr><tr><td><input type="submit" value="提交" name="event_submit_do_upload"></td><td><input type="reset" value="重置"></td></tr></table></form>
package com.alibaba.webx.MyWebxTest.myWebX.module.action;import com.alibaba.citrus.service.requestcontext.parser.ParserRequestContext;
import com.alibaba.citrus.turbine.Context;
import com.alibaba.citrus.turbine.Navigator;
import com.alibaba.citrus.turbine.dataresolver.Param;
import org.apache.commons.fileupload.FileItem;
import org.springframework.beans.factory.annotation.Autowired;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;/*** Created by zkn on 2016/4/7.*/
public class FileUploadAction {@Autowiredprivate HttpServletRequest request;@Autowiredprivate HttpServletResponse response;/*** Webx默认解析请求的类*/@Autowiredprivate ParserRequestContext parserContext;public void doUpload(@Param("userName") String name, Context context, Navigator na) {//获取用户名String userName = request.getParameter("userName");//获取密码String passWord = request.getParameter("passWord");System.out.println("userName:"+userName+"   passWord:"+passWord);//Webx实现文件上传FileItem fileItem = parserContext.getParameters().getFileItem("fileUpload");String fileDir = "D:\\Document";try{fileItem.write(new File(fileDir+"\\"+System.currentTimeMillis()+fileItem.getName()));}catch (Exception e){e.printStackTrace();}}
}

看起来是不是很方便啊。

上面介绍完了<parser />解析参数,下面我们来介绍Upload服务,如果没有配置Upload服务,只是<parser />的话那么<parser>还是不可以解析multipart/form-data表单请求的。

Upload服务

配置Upload服务

Upload服务的配置参数如下:

<services:upload sizeMax="5M" fileSizeMax="2M" repository="/tmp" sizeThreshold="10K" keepFormFieldInMemory="true" />

Upload服务配置参数说明

参数名称 说明
sizeMax HTTP请求的最大尺寸(字节,支持K/M/G),超过此尺寸的请求将被抛弃。值-1表示没有限制。
fileSizeMax 单个文件允许的最大尺寸(字节,支持K/M/G),超过此尺寸的文件将被抛弃。值-1表示没有限制。
repository 暂存上传文件的目录。 注意,这个目录是用SpringResourceLoader装载
的,而不是一个物理路径。关于ResourceLoader,详见ResourceLoading
服务的文档。
sizeThreshold 将文件放在内存中的阈值(字节,支持K/M/G),小于此值的文件被保存在
内存中
keepFormFieldInMemory 是否将普通的form field保持在内存里? 默认为false,但
当sizeThreshold为0时,默认为true

注意:

当上传文件的请求的总尺寸超过sizeMax的值时,整个请求将被抛弃 ——这意味着你不可能读到请求中的其它任何参数。而当某个上传文件的尺寸超出fileSizeMax的限制,

但请求的总尺寸仍然在sizeMax的范围内时,只有超出该尺寸的单个上传文件被抛弃,而你还是可以读到其余的参数。

手工解析上传请求

在默认情况下,当<parser>收到一个上传文件的请求时,会立即解析并取得所有的参数和文件。然而你可以延迟这个过程,在需要的时候,再手工解析上传请求。
首先:你需要关闭自动上传
<parser autoUpload="false">

然后:你只需要调用下面这句话就可以了

parser.getParameters().parseUpload();

手工调用parseUpload(),你可以指定和默认不同的参数:

UploadParameters params = new UploadParameters();
params.applyDefaultValues();
params.setSizeMax(new HumanReadableSize("10M"));
params.setFileSizeMax(new HumanReadableSize("1M"));
params.setRepository(new File("mydir"));
parser.getParameters().parseUpload(params);

限制文件类型

在Webx里,你可以用一种简单的方式来进行文件类型的过滤(想当年在这里我可以被坑的不能行啊。。。),话不多说,配置如下:

            <filters><parser-filters:uploaded-file-whitelistextensions="jpg, gif, png" /></filters>

对文件类型的过滤是用到了Webx里的UploadedFileFilte过滤器接口,其实,<parser>支持两种过滤器接口:ParameterValueFilter和UploadedFileFilter。前者用来对普通的参数值进行过滤(例如排除可能造成攻击的HTML代码);后者用来对上传文件的file item对象进行过滤,就像刚才的uploaded-file-whitelist的例子。

另外<parser> - 解析参数还有很多高级的用法,我们以后再说。

Webx系列之文件上传相关推荐

  1. Selenium系列教程 - 文件上传

    主要内容 一.通过send_keys方法(该方法只适用于input标签) 二.通过AutoIt来处理上传文件(适用所有) 三.其他方法 四.多文件上传 在Web UI自动化测试中可能会遇到文件上传的场 ...

  2. oracle apex接口文件,Oracle Apex 实用笔记系列 2 - 文件上传管理

    1. 页面设计 页面A有若干region, 其中一个region用于文件列表管理(包括显示,下载,删除),如图A.在页面A有一button,点击它会调用页面B,页面B负责文件上传,如图B. 图A 图B ...

  3. SpringBoot文件上传异常之temporary upload location not valid

    原文: 一灰灰Blog之Spring系列教程文件上传异常原理分析 SpringBoot搭建的应用,一直工作得好好的,突然发现上传文件失败,提示org.springframework.web.multi ...

  4. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  5. jsp文件上传_猿蜕变系列7——也说说springMVC上传姿势

    看过之前的蜕变系列文章,相信你对springMVC有了一定的认识.对springMVC的异常处理,也有了一定的认识.今天我们来开启新讨论,讲一讲web开发中会经常遇到的一个功能,文件上传. 猿蜕变同样 ...

  6. JSP 文件上传下载系列之二[Commons fileUpload]

    前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是:  让添加强壮,高性能的文件到你的se ...

  7. JSP 文件上传下载系列之一[基本方式上传文件]

    前言 在jsp的web项目中,很有可能会使用文件上传的功能. 把一个本地的文件上传到web 服务器的某个路径下. 对于java 来说, 实现这样功能的开源组件有很多, 比如较常用的commons-fi ...

  8. weblogic系列漏洞整理————8、WebLogic 两处任意文件上传漏洞动态分析(CVE-2018-2894)

    0x01 前言 CNCERT前几天发公告称发现Oracle公司出品的基于JavaEE结构的中间件WebLogic产品存在一个远程上传漏洞,并得到了厂商的确认,危害程度评分高达9.8分.鉴于厂商已进行了 ...

  9. form表单校验复杂系列--- form表单内插入独立的数据表格,动态校验数据表格内每行的文件上传

    form表单校验复杂系列- form表单内插入独立的数据表格,动态校验数据表格内每行的文件上传 前言 公司项目有个模块需要优化form表单内,插入独立的数据表格,表格内容是文件上传,需要利用外部表单提 ...

  10. 【Java编程系列】Minio实现文件上传下载

    热门系列: [Java编程系列]Amazon S3实现文件上传下载 目录 热门系列: 1.前言 2.Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Mi ...

最新文章

  1. 如何使用Navicat恢复数据库脚本
  2. 51nod 1435 位数阶乘 (手动计算)
  3. 看完这个“秒杀”设计方案!我有点慌了
  4. 在VC中使用ADO开发数据库应用程序
  5. python命令解析_python学习(命令行的解析)
  6. cisco 交换机设置时区、时间、同步日志本地时间等操作
  7. 最好用的终端模拟器ZOC for Mac 8.04
  8. ASP.NET与MVC架构区别总结
  9. 某TS流视频文字识别系统
  10. 完美可用-DirectX修复工具增强版DirectX Repair
  11. HTML 两种对密码加密的方法
  12. ZBrush与数位板雕刻模型如何才能结合
  13. 如何将amr文件转成mp3格式?
  14. 有赞裁员1500人?说说有赞为什么会跌落神坛
  15. 【墙角数枝梅,凌寒独自开】代码改变未来
  16. 数据管理平台与数据治理平台的区别和联系
  17. 使用turtle画随机颜色的圆圈
  18. [zt] dmt、lmt、mssm, assm (SEGMENT SPACE MANAGEMENT AUTO) 的一点总结
  19. 怎么去学习绘画格子裙?该怎么画格子裙?
  20. 三值的排序 Sorting a Three-Valued Sequence(洛谷 P1459)

热门文章

  1. Js——ES2015(ES6)基础语法
  2. 写贺卡给毕业师姐怎么写计算机系的,写给师姐的毕业祝福语赠言 送给师姐的毕业祝福语大全...
  3. matlab优化工具箱OptimizationToolbox使用方法
  4. 幼儿园观察记录的目的和目标_幼儿园一日观察报告
  5. 【大学总结】迟到但未缺席的大学总结
  6. 每页都有的表头和打印分页
  7. matlab海图栅格化_matlab栅格化图片代码
  8. 干货来啦!「敏捷开发畅想与实战」沙龙回顾
  9. 【WiFi 6E】WiFi 6E信道分布
  10. Navigator对象,获取浏览器类型userAgent,机器类型platform