Java 上传文件,角度弹簧启动
我需要上传文件使用角度和弹簧启动 角度服务:Java 上传文件,角度弹簧启动,java,angular,spring,Java,Angular,Spring,我需要上传文件使用角度和弹簧启动 角度服务: const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json;multi-part/form-data'}) }; addProduct(productRequest: ProductRequest, creator: string, tradeReference: string, selectedImage: File)
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json;multi-part/form-data'})
};
addProduct(productRequest: ProductRequest, creator: string, tradeReference: string, selectedImage: File) {
const trimCreator = creator.trim();
const trimTradeReference = tradeReference.trim();
const formData = new FormData();
formData.append('images', selectedImage);
return this.http.post<any>(baseUrl + '/addProduct', {formData, productRequest, trimCreator, trimTradeReference} , httpOptions)
.pipe(
catchError(this.handleError)
);
}
错误:
{“时间戳”:“2020-04-23T13:35:03.114+0000”,“状态”:500,“错误”:“内部”
服务器错误,“消息”:“当前请求不是多部分
请求“,”跟踪“:”org.springframework.web.multipart.MultipartException:
当前请求不是多部分请求\r\n\t
org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:158)\r\n\t
,“路径”:“/api/trader/addProduct”}
我试着像这样更新PostMapping
@PostMapping(value=“/”addProduct”),消耗=
{MediaType.MULTIPART\u FORM\u DATA\u VALUE,
MediaType.APPLICATION_JSON_VALUE})
我还删除了角度服务中的消耗信息和标题信息,但它不起作用
有了邮递员,一切都很好
所以我不明白为什么它不起作用
谢谢解决方案:
//角度服务:
const options = {} as any;
addProduct(productRequest: ProductRequest, selectedImages: File[]) {
const formData = new FormData();
for (let i = 0; i < selectedImages.length; i++) {
formData.append('images', selectedImages[i]);
}
Object.keys(productRequest).forEach((key) => {formData.append(key, productRequest[key]); });
return this.http.post<any>(baseUrl + '/addProduct', formData , options)
.pipe(
catchError(this.handleError)
);
}
请注意,产品对象被拆分为参数,以避免出现“内容类型”应用程序/八位字节流“不受支持”和“内容类型”多部分/表单数据“不受支持”等错误。将“realPrice”参数类型更改为双精度,将生成“内容类型”应用程序/八位字节流“不受支持”类型的异常,它与字符串一起工作 谢谢你的回答。它对我起了作用,也学会了解决办法
const options = {} as any;
addProduct(productRequest: ProductRequest, selectedImages: File[]) {
const formData = new FormData();
for (let i = 0; i < selectedImages.length; i++) {
formData.append('images', selectedImages[i]);
}
Object.keys(productRequest).forEach((key) => {formData.append(key, productRequest[key]); });
return this.http.post<any>(baseUrl + '/addProduct', formData , options)
.pipe(
catchError(this.handleError)
);
}
@ApiOperation(value = "add product", response = Iterable.class)
@ApiResponses(value = { @ApiResponse(code = 200, message = "Successfully added product") })
@PostMapping("/addProduct")
public void addProduct(@RequestPart(value = "images") @ApiParam(value = "images") MultipartFile[] images,
@RequestPart(value = "productName") @ApiParam(value = "productName") String productName,
@RequestPart(value = "description") @ApiParam(value = "description") String description,
@RequestPart(value = "realPrice") @ApiParam(value = "realPrice") String realPrice,
@RequestPart(value = "category") @ApiParam(value = "category") String category,
@RequestPart(value = "creator") @ApiParam(value = "creator") String creator,
@RequestPart(value = "tradeReference") @ApiParam(value = "tradeReference") String tradeReference
) throws Exception {
Product p = createProduct(productName, description, Double.valueOf(realPrice), category, creator, tradeReference);
Arrays.asList(images)
.stream()
.forEach(image -> uploadImages(image, p));
traderServices.addProduct(p);
}