资讯专栏INFORMATION COLUMN

使用commons-fileupload时,文件上传与表单参数同时提交时的后台代码处理

JinB / 3254人阅读

摘要:把表单是的是基于流的,只能获取一次,重复获取将为空当上传文件的控件与的字段混合时直接用一般是不行的下面的代码进行同时表单参数获取和文件上传这里取得字段名称如果已经存在此字段信息多选列表或多个同名的隐藏域等第一次取到这个名的字段这里而要对文

把Form表单是的enctype="multipart/form-data"是基于流的,只能获取一次,重复获取将为空,当上传文件的input控件与hidden的input字段混合时,直接用request.getParameter一般是不行的.

下面的代码进行同时表单参数获取和文件上传:

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;

...

 Map> getFieldMap(
            HttpServletRequest request) throws UnsupportedEncodingException {

        Map> fieldsMap;
        fieldsMap = (Map>) request
                .getAttribute(ServletFileUpload.MULTIPART_FORM_DATA);
        if (fieldsMap == null) {
            fieldsMap = new HashMap>();
            request.setAttribute(ServletFileUpload.MULTIPART_FORM_DATA,
                    fieldsMap);
        } else {
            return fieldsMap;
        }

        ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory());
        List li = null;
        try {
            li = fu.parseRequest(request);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        int m = 0;
        if (li != null) {
            Iterator iter = li.iterator();
            while (iter.hasNext()) {
                FileItem fi = (FileItem) iter.next();
                if (fi.isFormField()) {
                    Vector vec = new Vector();
                    String fieldName = fi.getFieldName(); // 这里取得字段名称
                    // 如果已经存在此字段信息(多选列表或多个同名的隐藏域等)
                    if (fieldsMap.get(fieldName) != null) {
                        vec = (Vector) fieldsMap.get(fieldName);
                        vec.add(fi.getString(request.getCharacterEncoding()));
                    }
                    // 第一次取到这个名的字段
                    else {
                        // logger.info("name:" + fieldName + " value: "
                        // + fi.getString(request.getCharacterEncoding()));
                        vec.add(fi.getString(request.getCharacterEncoding()));
                        fieldsMap.put(fieldName, vec);
                    }
                } else {

                    List fileNames = (List) request
                            .getAttribute(UPLOADEDFILENAME_ATTRIBUTE);
                    if (fileNames == null) {
                        fileNames = new ArrayList();
                        request.setAttribute(UPLOADEDFILENAME_ATTRIBUTE,
                                fileNames);
                    }

                    String storePath = request.getSession().getServletContext()
                            .getRealPath(UPLOADEDFILEPATH);
                    try {
                        if (fi.getSize() > 0) {
                            //这里而要对文件重全名, 可能从之前的filename取得扩展名,并白名单过滤
                            fi.write(new File("somefilename"+m++)); // 写文件到服务器.
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return fieldsMap;
    }

这里用的是apache的common-fileupload模块.
如果您使用maven构建, 需要在pom.xml里添加:


    commons-fileupload
    commons-fileupload
    1.2

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68149.html

相关文章

  • Nginx 搭建图片服务器

    摘要:搭建图片服务器本章内容通过和搭建图片服务器。第二个部分是为了更好的体验上传,批量上传,回显功能的富文本编辑器。总结搭建服务器的思维实现上传图片的功能上传图片的功能源码搭建图片服务器到这里就结束了,有什么不足的地方,请赐教。 Nginx 搭建图片服务器 本章内容通过Nginx 和 FTP 搭建图片服务器。在学习本章内容前,请确保您的Linux 系统已经安装了Nginx和Vsftpd。 N...

    jas0n 评论0 收藏0
  • SpringMVC入门笔记

    摘要:简介注解用于修饰的方法,根据的的内容,通过适当的转换为客户端需要格式的数据并且写入到的数据区,从而不通过视图解析器直接将数据响应给客户端。并且这些解析器都实现了接口,在接口中有四个最为主要的接口方法。 SpringMVC 细节方面的东西很多,所以在这里做一篇简单的 SpringMVC 的笔记记录,方便以后查看。 Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本...

    gekylin 评论0 收藏0
  • 7.1、使用Commons Fileupload上传文件

    摘要:你可以通过在应用程序上下文中添加一个解析器来启用的处理。当的检测到一个请求时,它会激活你声明好的解析器,然后把这个解析器转交给请求。解析器会把当前的扭曲为一个支持文件上传的。首先,创建一个带有的表单,这样用户就可以通过这个表单上传文件了。   最近家里的网出现了莫名其妙的问题,连不上码云了,所以把示例迁到了 github 上。本示例见这个项目的 master 分支的 ZestMulti...

    suosuopuo 评论0 收藏0
  • JavaWEB开发17——文件上传下载

    摘要:文件上传解析请求正文的每部分的内容。获取上传文件的大小获取上传文件对应的输入流把上传的文件保存到指定文件中。如果上传的文件超过,用磁盘作为缓存。如果自己用流实现的文件上传,要在流关闭后,清理临时文件。 一、文件的上传和下载1、文件上传的原理分析1.1文件上传的必要前提:a、提供form表单,method必须是postb、form表单的enctype必须是multipart/form-d...

    Tangpj 评论0 收藏0
  • spring mvc处理表单

    摘要:处理表单在使用时提交表单遇到了如下问题表单请求的通常有两种和。前一种类似于请求用连接参数,通常适用于字符串,第二种就通常适用于文件和参数混合的类型。对于第一种请求参数,的大多数例子都默认支持。 spring mvc处理表单 在使用spring mvc时 提交表单遇到了如下问题 表单请求的headers通常有两种content type: application/x-www-form-u...

    gaomysion 评论0 收藏0

发表评论

0条评论

JinB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<