MultipartFile上传文件获取表单数据

本文介绍了如何使用MultipartHttpServletRequest处理文件上传,包括获取文件原始名称、读取表单数据等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接使用request .getAttribute .getParameter都得不到普通表单数据

MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("userfile");
String filename = file.getOriginalFilename();
System.out.println(filename);
String name=request.getParameter("userName"); //用于用户验证 String pwd=request.getParameter("pwd");

转载于:https://my.oschina.net/maoguangdong/blog/1547763

### 关于 Spring `MultipartFile` 是否表示文件上传数据流 在 Spring 框架中,`MultipartFile` 接口确实被设计用来表示通过 HTTP 协议上传文件数据流[^1]。该接口提供了多种方法以便开发者能够轻松读取、保存或者获取有关上传文件的信息,比如文件名 (`getOriginalFilename`)、内容类型 (`getContentType`) 及其作为字节数组的内容 (`getBytes`) 等。 当控制器接收到来自前端带有 `multipart/form-data` MIME 类型请求时,Spring 自动将其中标记为文件的部分转换成 `MultipartFile` 实例传递给相应的处理器方法参数[^2]。 #### 如何将 multipart/form-data 放入 map 中发送? 要将整个 `multipart/form-data` 请求封装进一个 Map 结构并通过某种方式(例如 RESTful API 调用)发送出去,可以按照如下步骤操作: ##### 步骤一:创建包含所有 parts 的 Map 首先需要建立两个独立 Maps 分别存储普通键对形式的参数与二进制大对象即文件们。对于每一个非文件 part 我们可以直接存入字符串映射;而对于那些代表文件 uploads 则应加入专门处理后的 byte arrays 或者 InputStreams. ```java // 创建用于存放标准 key-value 参数的地图 Map<String, Object> params = new HashMap<>(); // 假设我们有一个 MultipartFile 对象名为 'file' MultipartFile filePart = ... ; if (!filePart.isEmpty()) { try { // 将文件转为字节数组并添加到另一个特定地图里 byte[] bytes = filePart.getBytes(); Map<String, byte[]> files = new HashMap<>(); files.put("file", bytes); // 合并两份资料成为最终版本供后续使用 params.putAll(files); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } params.put("paramName", "value"); // 加入其他常规参数 ``` ##### 步骤二:设置正确的 Content-Type 头部信息 由于目标服务端期望接受的是完整的 multi-part request 所以必须正确配置我们的 http client 来模拟这种行为。这涉及到指定合适的 content type string 包含随机生成的独特 boundary marker。 ```java String boundaryMarker = "---" + UUID.randomUUID().toString(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("multipart/form-data; charset=UTF-8; boundary=" + boundaryMarker)); ``` ##### 步骤三:构建 MultiValueMap 并执行 POST 请求 最后一步就是把之前准备好的 maps 组合成适合 spring rest template 使用的形式——MultiValueMap,并调用 exchange() 函数发出实际网络请求: ```java RestTemplate restTemplate = new RestTemplate(); MultiValueMap<String, Object> body = new LinkedMultiValueMap<>(params.size()); for(Map.Entry<String,Object> entry : params.entrySet()){ if(entry.getValue() instanceof byte[]){ ByteArrayResource resource = new ByteArrayResource((byte[])entry.getValue()){ @Override public String getFilename(){ return ((MultipartFile)(new DefaultMultipartHttpServletRequest(null,null,Collections.singletonMap(entry.getKey(),(Object)((byte[])getValue()))))).getFile(entry.getKey()).getOriginalFilename(); } }; body.add(entry.getKey(),resource); }else{ body.add(entry.getKey(),entry.getValue()); } } HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity , String.class ); System.out.println(response.getBody()); ``` 以上代码片段展示了如何手动构造一个多部分表单提交请求的过程,其中包括了文本字段和文件附件的组合情况下的实现细节[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值