`

Webx系列之文件上传

阅读更多

做过文件上传功能开发的人员都知道,对于文件上传需要设置表单类型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" onchange="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 {

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;
    /**
     * Webx默认解析请求的类
     */
    @Autowired
    private 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-whitelist
					extensions="jpg, gif, png" />
			</filters>
对文件类型的过滤是用到了Webx里的UploadedFileFilte过滤器接口,其实,<parser>支持两种过滤器接口:ParameterValueFilter和UploadedFileFilter。前者用来对普通的参数值进行过滤(例如排除可能造成攻击的HTML代码);后者用来对上传文件的file item对象进行过滤,就像刚才的uploaded-file-whitelist的例子。
另外<parser> - 解析参数还有很多高级的用法,我们以后再说。

 

 

 

 

 

分享到:
评论

相关推荐

    webx总结 项目实践总结

    首先,WebX会加载配置文件,这些配置文件通常包括`webx.properties`,定义了系统的基本设置。接着,框架会扫描指定的类路径,寻找并加载组件(Components),这些组件是WebX应用程序的核心。每个组件都有自己的生命...

    webx

    3. **动态表单**:WebX 支持动态表单生成,允许开发者通过配置文件定义表单字段和验证规则,自动根据数据库结构生成表单,减少了重复代码。 4. **数据库操作**:WebX 提供了强大的数据库操作接口,支持SQL语句的...

    Webx及框架简介

    5. **配置(Configuration)**:Webx的配置文件用于定义框架的行为和组件间的关联。开发者可以通过修改配置文件来调整框架的行为,例如设置URL映射、数据库连接信息等。 6. **插件(Plugins)**:Webx支持插件机制...

    WebX入门指南示例程序

    WebX项目的典型结构包括src/main/java(存放Java代码)、src/main/resources(存放资源配置文件)、WEB-INF(存放web.xml等Web应用配置文件)等。了解这些目录的作用对于后续开发至关重要。 4. **控制器...

    创建简单的WEBX应用

    虽然在这个简单的例子中我们不需要编写任何业务代码,但为了使 Webx 能找到我们的页面,我们需要在 `src/descriptors/web/services.xml` 文件中配置一个服务。如果该文件不存在,可以手动创建。在文件中添加如下内容...

    webx3文档——web开发

    Webx是基于Java的Web应用框架,它具有高成熟度和可靠性,并且具备强大的开放性和扩展性。Webx框架的文档详细介绍了该框架的设计理念、历史、优势以及与Spring框架的集成等方面。文档内容主要分为两大部分:Webx框架...

    Webx介绍_PDF

    - **升级案例**:淘宝后台项目、TQMS、ServiceManager等项目均成功升级到了Webx3.0,并且在升级过程中未修改任何应用代码,仅调整了配置文件,实现了无缝迁移。 - **示例程序**:提供了完整的宠物店Petstore示例程序...

    webx框架指南

    Webx的设计理念建立在层次化架构之上,提倡页面驱动、约定优于配置等设计原则。它的出现为Java开发者提供了一个可以替代传统Spring开发模式的新选择,特别是对于需要构建高效、可扩展Web应用的开发者。 在Webx框架...

    淘宝WEBX框架详解

    **淘宝WEBX框架详解** 淘宝WEBX框架是一个专为大型电子商务平台设计的高效、可扩展的Web应用程序开发框架。这个框架由阿里巴巴技术部门研发,旨在提高开发效率,保证系统的稳定性和可维护性,同时降低新手入门的...

    webx总结

    本文将对Webx进行深入探讨,主要涵盖其核心概念、工作原理以及与之相关的工具使用。 【描述】: 虽然描述信息为空,但我们可以从“博文链接”中推测,该文档可能包含了一篇关于Webx框架的博主个人经验总结,可能...

    webx_guide

    在Webx Framework之上,Webx Turbine作为一个页面处理层,采用了页面驱动的设计理念,这意味着Webx Turbine重视页面生成和页面流程的管理。页面布局和处理页面的基本流程是Webx Turbine的主要功能。Webx还支持依赖...

    阿里巴巴J2EE Webx框架简介

    当这些Car被组合成Petstore.war时,它们的目录结构会合并到一起,形成一个完整的Web应用程序结构,包括各个子模块如home、user、store和admin,每个子模块可能有自己的配置文件(webx.xml)和类库(classes)。...

    webx2.7绿色安装

    WEBX是阿里巴巴的内部框架,“就是把页面与Service层之间的一些Servlet等公共的东西抽象出来,提供相应的服务以提高开发效率(《接口测试之Webx简介》—何晓峰 )”,可以看出,webx和传统的servlet-action模式的...

    Webx3.0小结

    webx3.0学习小结

    webx-springExt整合eclipse插件

    Webx-SpringExt是Webx框架的一个扩展,它与Spring框架进行了深度集成,旨在提供更高效、更灵活的Web应用程序开发环境。Eclipse是一个广泛使用的Java集成开发环境(IDE),而这里的"webx-springExt整合eclipse插件"是...

    webx3学习的demo,以及留言板的小例子

    其次,`tutorial1` 文件可能是一个完整的WebX3教程项目,用于演示如何从零开始构建一个WebX3应用。在WebX3中,开发者需要配置应用的环境,设置数据源,编写XML配置文件来定义页面和业务逻辑,以及使用Java或...

    通用WEB框架 Webx.zip

    文件"citrus-master"可能是Webx框架的一个示例项目或者扩展库,名为"Citrus"。Citrus可能是一个测试框架或组件,用于帮助开发者进行单元测试、集成测试或端到端测试,确保Webx应用的功能正确性和性能表现。 总的来...

    webx3 PDF(阿里巴巴 前端web框架)

    - **修改资源文件的内容**:为了适应动态变化的场景,Webx还提供了对资源文件内容的修改功能。 - **直接使用ResourceLoadingService**:对于更高级的需求,可以直接使用ResourceLoadingService来进行定制化的资源...

Global site tag (gtag.js) - Google Analytics