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

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

把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<String, Vector<String>> getFieldMap(
            HttpServletRequest request) throws UnsupportedEncodingException {
        Map<String, Vector<String>> fieldsMap;
        fieldsMap = (Map<String, Vector<String>>) request
                .getAttribute(ServletFileUpload.MULTIPART_FORM_DATA);
        if (fieldsMap == null) {
            fieldsMap = new HashMap<String, Vector<String>>();
            request.setAttribute(ServletFileUpload.MULTIPART_FORM_DATA,
                    fieldsMap);
        } else {
            return fieldsMap;
        }
        ServletFileUpload fu = new ServletFileUpload(new DiskFileItemFactory());
        List<FileItem> li = null;
        try {
            li = fu.parseRequest(request);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        int m = 0;
        if (li != null) {
            Iterator<FileItem> iter = li.iterator();
            while (iter.hasNext()) {
                FileItem fi = (FileItem) iter.next();
                if (fi.isFormField()) {
                    Vector<String> vec = new Vector<String>();
                    String fieldName = fi.getFieldName(); // 这里取得字段名称
                    // 如果已经存在此字段信息(多选列表或多个同名的隐藏域等)
                    if (fieldsMap.get(fieldName) != null) {
                        vec = (Vector<String>) 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<String> fileNames = (List<String>) request
                            .getAttribute(UPLOADEDFILENAME_ATTRIBUTE);
                    if (fileNames == null) {
                        fileNames = new ArrayList<String>();
                        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里添加:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2</version>
</dependency>
相关文章
|
8月前
|
前端开发 Java
java通过commons-fileupload实现多张图片的上传(jsp页面)
java通过commons-fileupload实现多张图片的上传(jsp页面)
|
2月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
166 8
|
4月前
|
XML JSON Java
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
|
5月前
|
前端开发
第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
第一种方式:使用form表单将前端数据提交到servelt(将前端数据提交到servlet)
|
5月前
|
前端开发 JavaScript
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
这篇文章介绍了使用AJAX技术将前端页面中表单接收的多个参数快速便捷地传输到后端servlet的方法,并通过示例代码展示了前端JavaScript中的AJAX调用和后端servlet的接收处理。
这篇文章介绍了如何使用form表单结合Bootstrap格式将前端数据通过action属性提交到后端的servlet,包括前端表单的创建、数据的一级和二级验证,以及后端servlet的注解和参数获取。
|
8月前
springmvc五种数据提交方式
springmvc五种数据提交方式
QGS
浅谈SpringMVC的五种数据提交方式
浅谈SpringMVC的五种数据提交方式
QGS
107 0
|
Java
JSP 读取表单数据
JSP 读取表单数据
97 0
|
前端开发 数据库
struts2实现的文件上传下载案例(二)、FileUpLoad文件的下载
struts2实现的文件上传下载案例(二)、FileUpLoad文件的下载
118 0
|
XML 前端开发 Java
SpringMVC--常用的三种文件实现上传实现方式你知道么?
文件的上传与下载基本上是web项目中会用到的技术,在web学习中我们用到的是 Apache fileupload这个组件来实现上传,在springmvc中对它进行了封装,让我们使用起来比较方便,但是底层还是由Apache fileupload来实现的。springmvc中由MultipartFile接口来实现文件上传。
358 0