邮递员:所需的请求部分 'file' 不存在
Postman: Required request part 'file' is not present
我想通过邮递员将图片上传到我的 Rest API。我正在使用 spring 启动框架。这是屏幕截图:
我也 没有设置任何 headers 因为我在其他堆栈溢出答案中发现它给出了多部分边界错误。
现在,下面是我的控制器代码:
package com.practice.rest.assignment1.controller;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.practice.rest.assignment1.model.Product;
import com.practice.rest.assignment1.service.CatalogueService;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
@RestController
@RequestMapping("/CatalogueController/")
public class CatalogueController{
@Autowired
private CatalogueService catalogueService;
@RequestMapping(value = "addProduct", method = RequestMethod.POST , consumes = "multipart/form-data")
public Product addProduct(@RequestParam String productJson, @RequestParam MultipartFile file) throws JsonParseException, JsonMappingException, IOException {
Product product = new ObjectMapper().readValue(productJson, Product.class);
byte[] mediaBytes = file.getBytes();
product.setImage(mediaBytes);
return catalogueService.saveInDb(product);
}
}
现在,我正在使用一个产品 object,它内部包含一个定义为 byte[] 数组的图像。我将其作为字符串和图像分别作为多部分文件。
下面是我的产品 class 定义的属性:
private Long pId;
private String model;
private String brand;
private byte[] image; // This is where I want the image to save
private Long price;
private String currency;
private String transmissionType;
private String fuelType;
因为,我正在使用 spring 引导,这是我的主要 class :
package com.practice.rest.assignment1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
我得到的邮递员错误是:
{
"timestamp": 1478611635977,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.multipart.support.MissingServletRequestPartException",
"message": "Required request part 'file' is not present",
"path": "/CatalogueController/addProduct"
}
我哪里错了?
我认为问题出在您发送的 JSON 参数上。在邮递员中,您不需要将开头和结尾的 " 表示为字符串的参数。
而且,如果您使用开始和结束 ",那么在 JSON 中(意味着 JSON 对象的属性键和值)您应该使用 '(单引号)。
嗨@Breaking Benjamin 我做了一个相同的演示,这是我的 post 请求副本:
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' \
-H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' \
-H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundary0ae4CymwYLjdqdI1' \
-H 'Accept: */*' -H 'Cache-Control: no-cache' \
-H 'Cookie: _ga=GA1.1.433565887.1474948752' \
-H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="a"\r\n\r\n123\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1--\r\n' --compressed
而且,我的上传控制器是这样写的:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity handleUpload(
@RequestParam("a")String a,
@RequestParam("file") MultipartFile multipartFile) throws IOException {
System.out.println(a);
...
在我的控制台中,参数a
成功输出:
即使我使用json字符串再次发送请求:
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' -H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBTudL55M6S8ENLVt' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Cookie: _ga=GA1.1.433565887.1474948752' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="a"\r\n\r\n"{"key":"value"}"\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt--\r\n' --compressed
看起来你的代码没问题,但你会尝试使用curl
再次发送请求,可能是因为你对postman.
的使用不当
尝试删除 'Content-Type: multipart/form-data...'
,headers 部分。它为我解决了这个问题。
对我来说,它可以在 application.properties:
中设置这些变量
spring.http.multipart.enabled=true
spring.http.multipart.location= /upload
对我来说,通过更新变量来更新我的 application.properties
spring.http.multipart.enabled=真
我的服务是
@PostMapping(value = "/console")
public ResponseEntity<RxConsoleDTO> addRxConsole(@RequestParam("attachment") MultipartFile attachmentFile, @RequestParam("type") String type) throws IOException {// your logic}
还要检查下面的 属性 是否启用,如果我们上传的是文本文件,它不会被视为正确的参数。
upload.file.extensions=jpg, jpeg, gif, png
我刚遇到你的问题,因为我也遇到了同样的错误。
注意:我正在编写一个 pyTest 来测试我的 API.
我刚刚从文件中删除了以下行
'Content-Type': 'multipart/form-data; boundary=--------------------------561045520875406684819091',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
而且,它奏效了:)
我遇到了同样的问题,后来证明不是Postman本身的问题。
我添加了 MultipartResolver bean,它解决了问题 -
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(-1);
return multipartResolver;
}
我想通过邮递员将图片上传到我的 Rest API。我正在使用 spring 启动框架。这是屏幕截图:
我也 没有设置任何 headers 因为我在其他堆栈溢出答案中发现它给出了多部分边界错误。
现在,下面是我的控制器代码:
package com.practice.rest.assignment1.controller;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.practice.rest.assignment1.model.Product;
import com.practice.rest.assignment1.service.CatalogueService;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
@RestController
@RequestMapping("/CatalogueController/")
public class CatalogueController{
@Autowired
private CatalogueService catalogueService;
@RequestMapping(value = "addProduct", method = RequestMethod.POST , consumes = "multipart/form-data")
public Product addProduct(@RequestParam String productJson, @RequestParam MultipartFile file) throws JsonParseException, JsonMappingException, IOException {
Product product = new ObjectMapper().readValue(productJson, Product.class);
byte[] mediaBytes = file.getBytes();
product.setImage(mediaBytes);
return catalogueService.saveInDb(product);
}
}
现在,我正在使用一个产品 object,它内部包含一个定义为 byte[] 数组的图像。我将其作为字符串和图像分别作为多部分文件。
下面是我的产品 class 定义的属性:
private Long pId;
private String model;
private String brand;
private byte[] image; // This is where I want the image to save
private Long price;
private String currency;
private String transmissionType;
private String fuelType;
因为,我正在使用 spring 引导,这是我的主要 class :
package com.practice.rest.assignment1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
我得到的邮递员错误是:
{
"timestamp": 1478611635977,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.multipart.support.MissingServletRequestPartException",
"message": "Required request part 'file' is not present",
"path": "/CatalogueController/addProduct"
}
我哪里错了?
我认为问题出在您发送的 JSON 参数上。在邮递员中,您不需要将开头和结尾的 " 表示为字符串的参数。 而且,如果您使用开始和结束 ",那么在 JSON 中(意味着 JSON 对象的属性键和值)您应该使用 '(单引号)。
嗨@Breaking Benjamin 我做了一个相同的演示,这是我的 post 请求副本:
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' \
-H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' \
-H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundary0ae4CymwYLjdqdI1' \
-H 'Accept: */*' -H 'Cache-Control: no-cache' \
-H 'Cookie: _ga=GA1.1.433565887.1474948752' \
-H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="a"\r\n\r\n123\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1--\r\n' --compressed
而且,我的上传控制器是这样写的:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity handleUpload(
@RequestParam("a")String a,
@RequestParam("file") MultipartFile multipartFile) throws IOException {
System.out.println(a);
...
在我的控制台中,参数a
成功输出:
即使我使用json字符串再次发送请求:
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' -H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBTudL55M6S8ENLVt' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Cookie: _ga=GA1.1.433565887.1474948752' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="a"\r\n\r\n"{"key":"value"}"\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt--\r\n' --compressed
看起来你的代码没问题,但你会尝试使用curl
再次发送请求,可能是因为你对postman.
尝试删除 'Content-Type: multipart/form-data...'
,headers 部分。它为我解决了这个问题。
对我来说,它可以在 application.properties:
中设置这些变量spring.http.multipart.enabled=true
spring.http.multipart.location= /upload
对我来说,通过更新变量来更新我的 application.properties spring.http.multipart.enabled=真
我的服务是
@PostMapping(value = "/console")
public ResponseEntity<RxConsoleDTO> addRxConsole(@RequestParam("attachment") MultipartFile attachmentFile, @RequestParam("type") String type) throws IOException {// your logic}
还要检查下面的 属性 是否启用,如果我们上传的是文本文件,它不会被视为正确的参数。
upload.file.extensions=jpg, jpeg, gif, png
我刚遇到你的问题,因为我也遇到了同样的错误。 注意:我正在编写一个 pyTest 来测试我的 API.
我刚刚从文件中删除了以下行
'Content-Type': 'multipart/form-data; boundary=--------------------------561045520875406684819091',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
而且,它奏效了:)
我遇到了同样的问题,后来证明不是Postman本身的问题。 我添加了 MultipartResolver bean,它解决了问题 -
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(-1);
return multipartResolver;
}