我正在尝试创建一个页面,用户可以在其中发布图像及其详细信息。现在,在测试邮递员的spring boot服务时,我已经能够成功获取服务中的文件。在尝试从angular5执行相同操作时,多部分文件在服务中未得到识别,并且始终获取空数组。
@RequestMapping(value= "/upload", method=RequestMethod.POST)
public AppResponse<User> saveUser(@RequestParam("userId") Long userId, @RequestParam("files") List<MultipartFile> files, HttpServletRequest request){
int i=0;
User user=userLogic.getUserById(userId);
String[] imageUrls= new String[files.size()];
try {
for(MultipartFile file:files) {
if(file.getContentType().equals("image/jpeg") || file.getContentType().equalsIgnoreCase("image/pjpeg")) {
ObjectMetadata meta= new ObjectMetadata();
meta.setContentType(file.getContentType());
meta.setContentDisposition(userId+"_"+i);
PutObjectResult result=s3Client.putObject(PHOTO_DIRECTORY,getFileName(userId, i),file.getInputStream(),meta);
imageUrls[i]=PHOTO_DIRECTORY+"/"+getFileName(userId, i);
} else {
throw new InvalidFileFormatException("This filetype is not accepted");
}
}
user.setActorPhotos(imageUrls);
userLogic.saveUser(user);
return new AppResponse<>(false, "Success");
}
catch(InvalidFileFormatException | IOException e) {
System.err.println("Exception in file upload");
return new AppResponse<>(true, "Failure");
}
我的角度服务代码如下
postPhotos(files: any,userId:any): Observable<any> {
let formData = new FormData();
formData.append("files",files,"files");
return this.http.post<Result>(URLConfig.postPhotos+"?userId="+userId, formData);
}
我尝试从angular添加诸如multipart / form-data之类的标头,并将其设置为undefined。无论哪种方式,我都会出错。在这里发布之前,我已经对stackoverflow进行了广泛的搜索,并在没有任何帮助的情况下尝试了所有这些解决方案。
预先感谢您的帮助。
答案 0 :(得分:0)
您需要在标题中将设置的内容类型设置为multipart / form-data。 如下所示修改您的服务方法,然后尝试一下。
postPhotos(files: any,userId:any): Observable<any> {
const url = "whatever /the/ url is ";
let headers = new HttpHeaders({
'Content-Type':'multipart/form-data'
});
let options = { headers: headers };
return this.http.post<Result>(url, formData,options);
}
请注意,此外,您还需要在标头中设置响应类型(即接受)。 让我们知道它是否有效。
答案 1 :(得分:0)
postPhotos(files: any[], userId: any): Observable<any> {
let headers = new HttpHeaders({'Content-Type':'multipart/form-data'});
let formData = new FormData();
files.forEach((item: any) => {
formData.append("files", item, "files");
});
return this.http.post<Result>(url, formData, options);
}