загрузка файлов, angular весенняя загрузка - PullRequest
1 голос
/ 23 апреля 2020

Мне нужно загрузить файлы, используя angular и пружинную загрузку.

Angular service:

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

Ошибка:

{"отметка времени": "2020-04-23T13: 35: 03.114 + 0000", "статус": 500, "ошибка": "Внутренняя ошибка сервера" , "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"}

* 1014 Я пытался обновить PostMapping так, как

@ PostMapping (value = "/ 'addProduct", потребляет = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE})

также я удалил потребляет информацию и информацию заголовка в angular сервисе, но он не работает.

с почтальоном отлично работает.

enter image description here

Так что не могу понять, почему это не работает!

Спасибо

1 Ответ

1 голос
/ 25 апреля 2020

Решение:

// Angular service:

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 Service:

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

обратите внимание, что объект Product разбивается на параметры чтобы избежать ошибок, таких как «Тип содержимого« application / octet-stream »не поддерживается» и «Тип содержимого« multipart / form-data »не поддерживается». Изменив тип параметра 'realPrice' на Double, создайте исключение типа "Тип содержимого" application / octet-stream "не поддерживается", он работает со строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...