java spring formdata_springMvc 完美解决 multipart/form-data 方式提交请求

a5c3e761b90b8ec031559f27f97a198b.png

前端时间处理上传文件时遇到了一些问题 multipart/form-data 方式提交的请求 在无法用Filter 中用 ServletRequest.getParameter 方法取不到一并提交上来的 参数,网上说 需要使用 ServletRequest.getReader() 方法 来获取请求信息(RequestPayload), 然后在解析字符串来获取想要的参数。 但是! ServletRequest.getReader() 只能获取一次,如果在拦截其中 取出了requestPayload ,那么在spring的 controller 中 你将取不到参数和文件了!!!!!

摸索到了这里我发现这是走了弯路, 既然 springMVC 的接口中可以获取到 参数,那说明 spring 已经很好的解决了这个问题 咱们就不要自己造轮子了;

!!!!!!!!!!干货来了

通过查看mvc的源码 果然 发现了两个类,

1.1.实现了、 ServletRequest的 org.springframework.web.multipart.MultipartHttpServletRequest.java 类 (这个类的 getParameter 方法可以获取到 multipart/form-data 和 非multipart/form-data 方法上传的 参数)

1.2.用于创建 MultipartHttpServletRequest.java 的 org.springframework.web.multipart.MultipartResolver.java 类

使用方法

2.1 首先在你的spring配置文件中 配置 MultipartHttpServletRequest

1048576004096

2.2 在你的拦截其中 注入 MultipartHttpServletRequest

// 用于创建MultipartHttpServletRequestprivate MultipartResolver multipartResolver = null;@Overridepublic void init(FilterConfig arg0) throws ServletException {// 注入beanmultipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class));}

2.3 在你的最顶层的 拦截器中 把你的 ServletRequest 替换成 MultipartHttpServletRequest

/*** 获取 request* @param req* @return*/private ServletRequest getRequest(ServletRequest req){String enctype = req.getContentType();if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))// 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数return multipartResolver.resolveMultipart((HttpServletRequest) req);elsereturn req;}

2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于出于安全考虑,HTML input type file 控件并不允许获取完整路径,只能获取文件名。如果要将选中的文件上传到服务器,可以通过以下步骤实现: 1. 在 HTML 页面中添加一个 input type="file" 控件,用户可以通过该控件选择文件。 2. 使用 JavaScript 监听 input 控件的 onchange 事件,当用户选择文件后,触发该事件。 3. 使用 JavaScript 从 input 控件中获取文件对象,可以使用 FileReader API 对文件进行读取和处理。 4. 将文件对象通过 AJAX 请求发送到服务器端,由 Spring MVC 框架进行处理。 以下是一个基本的实现过程: HTML 页面: ```html <form id="upload-form" enctype="multipart/form-data"> <input type="file" id="file-input" name="file"/> <button type="submit">上传</button> </form> ``` JavaScript 代码: ```javascript var fileInput = document.getElementById('file-input'); fileInput.addEventListener('change', function() { var file = fileInput.files[0]; var reader = new FileReader(); reader.onload = function() { // 处理读取到的文件内容 }; reader.readAsText(file); // 以文本方式读取文件内容 }); var form = document.getElementById('upload-form'); form.addEventListener('submit', function(event) { event.preventDefault(); // 阻止表单默认提交行为 var file = fileInput.files[0]; var formData = new FormData(); formData.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.send(formData); // 发送文件数据到服务器 }); ``` 后端 Spring MVC 控制器: ```java @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 处理上传的文件 return "File uploaded successfully"; } ``` 在上述代码中,前端使用 JavaScript 监听 input 控件的 onchange 事件,读取选中的文件,并通过 AJAX 请求发送到服务器端。后端 Spring MVC 控制器通过 @RequestParam 注解获取上传的文件,并进行处理。需要注意的是,由于上传文件是一个耗时的操作,建议在服务器端使用异步方式处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值