获取“必需的请求部分'文件'不存在”错误

时间:2018-05-23 12:27:48

标签: java spring angular

当我尝试从Angular前端向Java Spring发送PUT请求时,我收到Required request part 'file' is not present错误。我把这个名字作为'文件'放在FormData中,但我认为它看起来不像那样。

当我在Postman中使用相同的PUT请求时,它确实有效。

这是我的服务,其他方法可以工作:

@Injectable()
export class ExamService {
  examens: Examen[] = [];

  constructor(private http: HttpClient) {}

  getExams(): Observable<Examen[]> {
    return this.http.get<Examen[]>(APIURL + '/all');
  }

  getExamById(id): Observable<Examen> {
    return this.http.get<Examen>(APIURL + '/asobject/' + id);
  }

  updateExamById(id, exam: Examen) {
    const fd = new FormData();
    console.log(exam.file);
    fd.append('name', exam.naam);
    fd.append('file', exam.file);
    return this.http.put<Examen>(APIURL + '/update/' + id, fd);
  }
}

这是我发送的有效负载,所以它似乎确实以正确的方式发送它:

------WebKitFormBoundarynGgRxEgh6IdsxOiR
Content-Disposition: form-data; name="name"

Exam1
------WebKitFormBoundarynGgRxEgh6IdsxOiR
Content-Disposition: form-data; name="file"

4.868,68
------WebKitFormBoundarynGgRxEgh6IdsxOiR--

我在春天的控制器应该没错,因为Postman确实有效:

@PutMapping(value = "/update/{id}", consumes = "multipart/form-data")
public ResponseEntity UpdateExam(@RequestParam("file") MultipartFile file, @RequestParam("name") String name, @PathVariable("id") int id)
{
    Exam newExam = new Exam();
    newExam.setId(id);
    newExam.setSkelet(file.getOriginalFilename());
    newExam.setNaam(name);
    newExam.setCreatedAt(LocalDateTime.now());
    Exam exam2 = ExamFactory.update(newExam);
    examRepository.save(exam2);
    storageService.store(file);
    return created(URI.create("/skelet/exam/update/" + newExam.getId())).build();
}

1 个答案:

答案 0 :(得分:0)

你以错误的方式附加文件...请使用这种方式:

this.formData.append('file', file, file.name);

名称

  

其数据包含在值中的字段的名称。

  

该字段的值。这可以是USVString或Blob(包括   子类,如文件)。

filename可选

  

当Blob或文件时,文件名报告给服务器(USVString)   作为第二个参数传递。 Blob的默认文件名   对象是“blob”。 File对象的默认文件名是文件   文件名。