Java接受multipart/form-data表单时候List<FileItem> list = servletFileUpload.parseRequest(req)的值为空的bug

记录大学自学中遇到的bug. 之前也遇到很多,就算现在这个是第一个开始记录

12.13日晚上遇到的,次日中午才解决。

出现原因:我在multipart/form-data表单格式获取参数的时候用了getParameter来获取,Servlet前还加了这个注解@MultipartConfig,然后后面用那个uoload api (List<FileItem> list = servletFileUpload.parseRequest(req);)就不能再次获取了(我也不知道为什么,反正我的就是这么个情况),获取出来的list表单的size就一直是0,要获取form表单除文件的参数值的话就得在遍历list的时候解析,以下是我Servlet的源码希望能解决和我遇到一样问题的小伙伴~


import com.Ewan.utils.JsonUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;

import javax.json.Json;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


@MultipartConfig
public class Upload extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        String fullPath = "";
        String overwrite = "";
        String json = null;
        PrintWriter writer = resp.getWriter();
        //1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
        if (ServletFileUpload.isMultipartContent(req)) {
            //创建FileItemFactory工厂实现类
            FileItemFactory fileItemFactory = new DiskFileItemFactory();
            // 创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
            // 解析上传的数据,得到每一个表单项FileItem
            try {
                List<FileItem> list = servletFileUpload.parseRequest(req);
                //获取参数信息
                for (FileItem fileItem : list) {
                    if (fileItem.isFormField()) {
                        if ("fullPath".equals(fileItem.getFieldName())) {
                            fullPath = fileItem.getString("UTF-8");
                        }
                        if ("overwrite".equals(fileItem.getFieldName())) {
                            overwrite = fileItem.getString("UTF-8");
                        }
                    }
                }
                //解析文件
                for (FileItem fileItem : list) {
                    if (!fileItem.isFormField()) {
                        File file = new File("D://FileDemo/" + fullPath);
                        if (overwrite.equals("false") && file.isFile() && file.exists()) {
                            json = JsonUtils.returnJsonStringForLogin("", false, "ERR_FILE_EXIST");
                        } else {
                            String absolutePath = file.getPath();
                            fileItem.write(new File( absolutePath));
                            json = JsonUtils.returnJsonStringForLogin("", true, "操作成功");
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (json == null) json = JsonUtils.returnJsonStringForLogin("", false, "请上传文件");
        writer.write(json);
        writer.close();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值