所需的请求部分“文件”不存在 - Angular 4

Posted

技术标签:

【中文标题】所需的请求部分“文件”不存在 - Angular 4【英文标题】:Required request part 'file' is not present - Angular 4 【发布时间】:2019-08-23 09:09:46 【问题描述】:

我正在尝试使用 Angular 4 上传 csv 文件。

这是我在 Spring Boot 中的控制器 -

@PostMapping("/sop-master/csv-upload")
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public List<SopMasterDto> uploadCSV(@RequestParam("file") MultipartFile file, @RequestBody SopMasterDto sopMasterDto) throws IllegalStateException, IOException 
    return convertToDtos(sopMasterService.updateSopMaster(file, sopMasterDto.getUsername(),sopMasterDto.getPassword()), SopMasterDto.class);

这就是我使用 Angular 4 在 http post 中发送 csv 文件的方式 -

uploadCSV(file: File) 
    let formData:FormData = new FormData();
    formData.append('file', file, file.name);

    let headers = new Headers();
    headers.append('Content-Type', 'multipart/form-data; boundary=Inflow');
    headers.set('Accept', 'application/json');
    let options = new RequestOptions( 'headers': headers )

    return this.http.post(AppSettings.API_ENDPOINT + 'manage/sop-master/csv-upload/', formData, options)
        .map((res) => console.log(res))
        .catch(error => Observable.throw(error));

这就是我的看法-

<input type="file" class="btn btn-default" accept=".csv" (change)="changeListener($event.target.files)">

changeListener (files: FileList) 
    if (files && files.length > 0) 
    let file: File = files.item(0);
    this.manageService.uploadCSV(file)
      .subscribe((response) => 
          this.refreshDatatable();
      );
    

因此,通过 Postman 完成文件上传工作绝对正常,但通过 Angular 4 完成时我不断收到此错误 -

"status":400, "error":"Bad Request","exception":"org.springframework.web.multipart.support.MissingServletRequestPartException", "message":"Required request part 'file' is not present"

更新

附上我的浏览器控制台上出现的错误截图。

请求标头

从请求中删除自定义边界后的请求标头

从标头中删除内容类型后的请求标头

【问题讨论】:

检查实际请求以了解发生了什么。 检查浏览器控制台以查看实际请求。这是尽可能具体的。 那不是请求,而是响应——更准确地说,是应用程序对它的反应。显示请求。 我已经添加了请求。 【参考方案1】:
    您将自定义边界标头设置为“流入”,但浏览器会忽略它并使用自己的分隔符 - 服务器不知道如何拆分该多部分,从而导致丢失部分 浏览器没有显示文件内容(通常会显示)或者您根本没有发送它 - 可能 File 没有正确读取

对于初学者,不要使用自定义多部分边界,让浏览器处理它。 Send multipart/form-data files with angular using $http 这里的一些答案表明不需要显式声明多部分内容类型 - 但没有人描述它是作为多部分发送的。尝试专注于该主题。

【讨论】:

但如果我删除多部分边界,我会收到 FileUploadException 并显示此消息“无法解析多部分 servlet 请求;请求被拒绝,因为未找到多部分边界”。我是新手,请您帮忙提供代码。 删除自定义标头时检查请求。也许它根本就不是多部分的。 删除自定义边界后,我在上面添加了我的请求标头的屏幕截图。它似乎是多部分的。 检查这是否为您发送了多部分属性。 stackblitz.com/edit/… 顺便说一句,我没有使用糟糕的 chrome。 我可以看到浏览器没有在您的情况下设置边界。您是否完全删除了标题?或者你只是跳过边界?无论如何,我之前的评论中有一个工作示例。与之比较网络流量。【参考方案2】:

我认为您的问题是您将 @RequestParam("file") 和 @RequestBody 一起发送。

试试这个:

@RequestMapping(value = "/sop-master/csv-upload", method = RequestMethod.POST, consumes =  "multipart/form-data" )
public List<SopMasterDto> uploadCSV(@RequestPart("file") MultipartFile file, @RequestPart("sopMasterDto") SopMasterDto sopMasterDto) 
....

在 Angular 中:

let formData:FormData = new FormData();
    formData.append('file', file, file.name);
    formData.append('sopMasterDto', JSON.stringify(<your DTO ??? >))

    let headers = new Headers();
    headers.append('Content-Type', 'multipart/form-data');
    headers.set('Accept', 'application/json');
    let options = new RequestOptions( 'headers': headers )

    return this.http.post(AppSettings.API_ENDPOINT + 'manage/sop-master/csv-upload/', formData, options)
        .map((res) => console.log(res))
        .catch(error => Observable.throw(error));

【讨论】:

嘿,这没用。仍然出现同样的错误。

以上是关于所需的请求部分“文件”不存在 - Angular 4的主要内容,如果未能解决你的问题,请参考以下文章

上传文件springboot所需的请求部分“文件”不存在

使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”

在 tomcat 中运行的 Spring Boot,所需的请求部分“文件”不存在

Spring Boot 和 HTML 方法参数类型字符串所需的请求参数“Coord1”不存在]

jmeter中的相关问题:所需的防伪形式字段“__RequestVerificationToken”不存在

Spring-Boot REST - 所需的字符串参数不存在