Spring文件上传 - '必需的请求部分不存在'

时间:2017-10-04 10:59:12

标签: java spring rest postman spring-restcontroller

我正在尝试向我的控制器发送POST请求,但除非我决定使用JSON,否则无法传递任何类型的任何参数。我的目标是将一个字符串和一个文件传递给我的控制器,但我不断收到Required request part 'xxx' is not present错误。

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}

我不能在这里提交文件。同样,如果我尝试:

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name){
        return ResponseEntity.ok().body(null);
    }
}
同样的事我不能在这里得到名字。

我通过Postman发送请求,如以下屏幕截图所示:

Postman Request

Postman Request 2

唯一的标头标签用于授权。我没有任何Content-Type标头,我尝试添加multipart/form-data但没有帮助。

我只能通过添加到URL来传递String参数。所以跟http://localhost:8080/SearchBox/admin/config?name=test有效,但这不是我想要的。我想在Body部分中使用String和File参数。

我还通过CURL进行了测试:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config

注意:我已检查过类似帖子,但没有帮助 ThisThisThis

9 个答案:

答案 0 :(得分:10)

我终于解决了这个问题并分享了我的解决方案,以防其他人遇到同样的问题。

$re = '/(.*?[\.\!\?]){3}/';
// Pattern matches anything to a `.!?` three times. \ is added to make it literal 
$str = 'Without false modesty, we state that we have the best staff possible. And it\'s not some kind of farce, fiction or someone\'s evil joke. No, no - this is the most sincere truth. All our employees are incredibly welcoming, smiling, polite, tidy and competent in their work. Thanks to this, our sauna has been working successfully for many years, bringing pleasure to all its customers, both permanent and new. Come, we will be glad to see you.';
$subst = '$0<p></p>';

$result = preg_replace($re, $subst, $str);

echo $result;

答案 1 :(得分:2)

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestParam(value = "name") String 
name,@RequestParam(value = "file") MultipartFile file){
    // TODO check file is not null and save 
    return new ResponseEntity<>(HttpStatus.valueOf(200));;
}

enter image description here

答案 2 :(得分:1)

我怀疑主要原因是@RequestParam(&#34;文件&#34;) 应该有@RequestBody。

答案 3 :(得分:1)

将Bean添加到配置文件。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(-1);
    return multipartResolver;

}

答案 4 :(得分:1)

如果仍然出现错误,请尝试从邮递员中删除所有标头并删除文件类型

答案 5 :(得分:1)

在我的情况下,问题是我的 csv没有根据

中设置的字符串命名
@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {

enter image description here

enter image description here

答案 6 :(得分:0)

虽然这不是原始海报的问题,但如果您发现此问题并且上述解决方案均不适合您,请检查邮递员标题;如果设置了“Content-Type”标头,则可能导致上述错误。

删除“Content-Type”标题,它可能会解决上述问题。

有关详细信息,请参阅此问题:

Postman : Required request part 'file' is not present

答案 7 :(得分:0)

还考虑如果请求主体正在通过代理或任何其他可能不支持多部分/表单数据甚至八位字节流内容类型的中介进行访问,则请求主体可能无法到达服务器。希望可以通过额外的配置来解决此类请求。我还建议您配置请求拦截器,以便可以在控制器前后记录请求,这可能有助于您窥视请求参数,有效负载和标头。在我的情况下,我意识到请求正文的大小为0,这有助于我检测导致此错误的原因不是我的spring配置。 Here我留下了有用的资源来帮助您使用Spring开箱即用的日志拦截器。 enter link description here

答案 8 :(得分:0)

在我的情况下,解决方案在配置中缺少'@EnableWebMvc'注释

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

    @Bean
    fun multipartResolver(): MultipartResolver {
        val multipartResolver = CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(1000)
        multipartResolver.setMaxUploadSizePerFile(1000)
        return multipartResolver
    }
}