通过Spring上传文件

时间:2017-02-20 18:36:29

标签: java spring spring-mvc spring-boot

我有一个dev服务器,它在localhost:4200处旋转角度2,在localhost:8080处使用Spring旋转tomcat。 我尝试以下列方式将文件上传到服务器:

角度代码:

uploadAvatar(file:File){
    let xhr = new XMLHttpRequest()
    xhr.open("POST",`http://localhost:8080/api/upload/avatar`)
    xhr.setRequestHeader("Content-Type","multipart/form-data")
    xhr.send(file)
}

控制器代码Spring:

@RequestMapping(value = "/api/upload/avatar", method = RequestMethod.POST)
public String uploadFile(MultipartFile file){
    log.info(file);
    return file.getName();
}

但是在尝试下载文件后,错误出现在java-console中:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; 
nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

如何解决此错误?

谢谢。

更新1

"重复"与Spring MVC + JSP一起使用,我试图通过Ajax下载文件。这个决定的版本对我没有帮助。

更新2

Spring Boot(v1.4.3.RELEASE)
我使用java配置,如果你愿意,我会给出一个完整配置的例子。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法,下面的postorabs详细描述了我为此做了什么。

作为演示文稿,我使用Angular 2,发送文件的方式如下。

uploadFile(file:File){
    let form = new FormData();
    form.append("file",file)

    let xhr = new XMLHttpRequest()
    xhr.open("POST",`${URL}/api/upload/avatar`)
    xhr.send(form)
}

Content-Type和本案例中的boundary会自动关联。

需要在服务器Stronie上进行以下操作:

添加两个bean:

@Bean(name = "commonsMultipartResolver")
public MultipartResolver multipartResolver() {
    return new StandardServletMultipartResolver();
}


@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();

    factory.setMaxFileSize("10MB");
    factory.setMaxRequestSize("10MB");

    return factory.createMultipartConfig();
}

控制器如下所示:

@RequestMapping(value = "/api/upload/avatar", method = RequestMethod.POST,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String uploadFile(@RequestPart MultipartFile file){
    log.info(file);
    return file.getOriginalFilename();
}