【问题标题】:Current request is not a multipart request - Angular and Spring当前请求不是多部分请求 - Angular 和 Spring
【发布时间】:2021-09-13 22:14:00
【问题描述】:

我正在使用 angular 和 spring,我在后端遇到问题:

org.springframework.web.multipart.MultipartException: Current request is not a multipart request

我尝试将 xlsx 或 xlsm 文件发送到后端。

我已经尝试在标题中添加 enctype="multipart/form-data" 和 "Content-Type": "multipart/form-data"。

我应该添加什么来接受多部分请求?

谢谢。

上传文件.service.ts

import { Injectable } from '@angular/core';
import { HttpClient, HttpRequest, HttpHeaders, HttpEvent, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { CommonData } from '@arom/arom-platform-auth-lib';

@Injectable({
  providedIn: 'root'
})
export class UploadFileService {

  private headers: HttpHeaders;
  private commonData: CommonData;

  constructor(private http: HttpClient) {
    this.commonData = new CommonData();
    this.headers = new HttpHeaders(this.commonData.getCommonHeaders());
  }

  upload(fichier: File, idAffaire: string): Observable<Object> {
    console.log('Appel du webservice insererFichierExportGTI');

    let url = this.getPqiPath();
    url += environment.services.pqi.endpoints.postgtiservice;

    let params: HttpParams = new HttpParams().set('idAffaire', idAffaire);

    const formData: FormData = new FormData();
    formData.append('fichier', fichier);


    return this.http.post(url, { headers: this.headers, "Content-Type": "multipart/form-data", "fichier": formData, "idAffaire": idAffaire });
 
  }


  private getPqiPath(): string {
    let url: string = environment.services.protocol;
    url += '://';
    url += environment.services.hostname;
    url += ':';
    url += environment.services.gateway.port;
    url += environment.services.pqi.route;
    return url;
  }
}

gti-rechercher.component.html

<div class="container">

  <form method="post" action="/" enctype="multipart/form-data">

    <div class="form-row">
      <div class="col-md-8">
        <label for="parcourir_bouton">Fichier GTI :</label>
        <input pfmButton type="file" class="form-control-file" id="parcourir_bouton" name="import"
          formControlName="import" ngModel accept=".xlsx, .xlsm" (change)="selectFile($event)">

      </div>
      <div class="col-md-6">
        <button pfmButton type="submit" id="importer_bouton" class="btn btn-primary mb-2"
          (click)='two.startTimer(); upload()'>Importer</button>
      </div>
    </div>
  </form>
  <app-gti-timer #two></app-gti-timer>
</div>

AffaireController.java

@RequestMapping(value=("/api"),headers=("content-type=multipart/*"))
public class AffaireController extends AromController {

    @Autowired
    ServiceAffaire serviceAffaire;

    @PreAuthorize("#oauth2.hasScope('ma_tsc_insertion-export-fichier-gti')")
    @PostMapping(value = "/insererFichierExportGTI")
    @HystrixCommand(threadPoolKey = "domainThreadPool")
    public ResponseEntity<ApiResponse<JsonMessage>> insererFichierExportGTI(Long idAffaire,
            @RequestParam("file") MultipartFile fichier) {
        JsonMessage retour = new JsonMessage();

        retour.setMessage(serviceAffaire.insererFichierExportGTI(idAffaire, fichier));

        return getResponse(retour);
    }
}

【问题讨论】:

  • http.post 的第二个参数是帖子有效负载或帖子正文。您正在发送一个包含标题和表单数据的对象。您需要更正邮政编码。
  • @R.Richards 谢谢你,你让我走上了正轨。

标签: java angular


【解决方案1】:

答案:

   let retour = this.http.post<any>(url, formData, { headers: this.headers, params: params });

谢谢

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2017-01-27
  • 2017-06-20
  • 1970-01-01
  • 2018-06-01
  • 2021-11-16
相关资源
最近更新 更多