【问题标题】:upload files, angular spring boot上传文件,角度弹簧靴
【发布时间】:2020-08-06 21:33:28
【问题描述】:

我需要使用 Angular 和 Spring Boot 上传文件。

角度服务:

 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)
      );
  }

我的后端 Rest 服务如下:

    @ApiOperation(value = "add product", response = Iterable.class)
    @ApiResponses(value = { @ApiResponse(code = 200, message = "Successfully added product") })
    @PostMapping("/addProduct")
    public void addProduct(@RequestPart(value = "images") MultipartFile[] images,
                            @RequestPart(value = "product") Product product,
                            @RequestPart(value = "creator") @ApiParam(value = "creator") String creator,
                            @RequestPart(value = "tradeReference") @ApiParam(value = "tradeReference") String tradeReference
                            ) throws Exception {

        Arrays.asList(images)
                .stream()
                .forEach(image -> uploadImages(image, product));
        traderServices.addProduct(product, creator, tradeReference);
    }

错误:

{"timestamp":"2020-04-23T13:35:03.114+0000","status":500,"error":"内部 服务器错误","message":"当前请求不是多部分的 请求","trace":"org.springframework.web.multipart.MultipartException: 当前请求不是多部分请求\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:158)\r\n\tat ,"路径":"/api/trader/addProduct"}

我尝试像更新 PostMapping

@PostMapping(value = "/'addProduct", 消耗 = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})

我也删除了使用角度服务中的信息和标头信息,但它不起作用。

使用邮递员,它工作正常。

所以无法理解为什么它不起作用!

谢谢

【问题讨论】:

    标签: java angular spring


    【解决方案1】:

    解决方案:

    //角度服务:

    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)
              );
          }
    

    //Spring REST服务:

     @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);
        }
    

    请注意,产品对象被拆分为参数以避免诸如“不支持内容类型'application/octet-stream'”和“不支持内容类型'multipart/form-data'”之类的错误。将 'realPrice' 参数类型更改为 Double,生成类型为“不支持内容类型 'application/octet-stream'”的异常,它适用于字符串。

    【讨论】:

    • 感谢您的回答。它对我有用,也学会了解决方案
    猜你喜欢
    • 2023-03-29
    • 2018-08-09
    • 2019-05-17
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2017-12-22
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多