>

file.csv 를 반환하는 휴식 API가 있습니다. 그런 다음 응답이 200 인지 확인합니다. 데이터는 responsed.body 에도 있습니다 .

하지만 브루어는 CSV 파일을 다운로드하지 않았습니다.

다음은 API입니다.

ResponseEntity<Resource>  exportCsv() throws IOException {
    /*
     *
     */
    InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

    HttpHeaders headers = new HttpHeaders();
    headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
    headers.add("Pragma", "no-cache");
    headers.add("Expires", "0");
    return ResponseEntity.ok()
                         .headers(headers)
                         .contentLength(file.length())                 
                .contentType(MediaType.parseMediaType("text/csv"))
                         .body(resource);
}

여기는 각도입니다

this.stickService.exportCsv( this.stickSearch ).subscribe(
  response => this.downloadFile(response),
  err => console.log('Error downloading the file.'  + err.message 
));

downloadFile(data: Response) {
  const blob = new Blob([data], { type: 'text/csv' });
  const url = window.URL.createObjectURL(blob);
  window.open(url);
}

exportCsv( stickSearch: StickSearch ): Observable<Response> {
  const headers = this.oAuthService.putTokenInHeaders(this.headers);
  let params = new HttpParams({encoder: new HttpURIEncoder()});
  if (stickSearch.searchString() !== '') {
    params = params
    .append('search', stickSearch.searchString())
  }
  return this.httpClient.get<Response>(this.exportCsvUrl + '/exportCsv',
  {
    params: params,
    headers
  });
}

응답 본문에 올바른 데이터가 있습니다.

그러나 다운로드에 실패했습니다. 'Error downloading the file.Http failure during parsing for myURL '

도움을 주셔서 감사합니다

  • 답변 # 1

    서버에서 제공 한 결과물을 가져온 다음 해당 CSV에서 URL을 작성하고 있음을 알 수 있습니다. 필요하지 않습니다. CSV 만 다운로드하려면 Java 코드에 다음이 없습니다.

    headers.add("Content-disposition", "attachment; filename=sample.csv");
    
    

    헤더가 제자리에 있으면 downloadFile 를 제거 할 수 있습니다  방법과 아마도 this.httpClient.get 를 변경   window.open 에 요청 .

    문제가 해결되는지 확인하고 어느 경우 에나 피드백을 제공하십시오.

  • 답변 # 2

    기본적으로 HttpClient  서버의 데이터가 json 에 올 것으로 예상  체재. Angular는 텍스트 본문을 json으로 구문 분석하려고 시도합니다. 그리고 그것은 추방으로 이어집니다. stickService 에서  데이터를 요청할 때 유형 또는 결과를 text 로 지정해야합니다. :

    constructor (private httpClient: HttpClient){
    }
    public exportCsv(stickSearch: any) {
        return httpClient.get('http://someurl', {responseType: 'text'});
    }
    
    

    window.open(url) 를 사용하는 또 다른 점 . 대부분의 브라우저는 기본적으로 팝업 창을 차단합니다. 앵커 요소를 사용하는 것이 좋습니다.

    downloadFile(data: Response) {
        const blob = new Blob([data], { type: 'text/csv' });
        const url = window.URL.createObjectURL(blob);
        const anchor = document.createElement('a');
        anchor.download = 'myfile.txt'; // here you can specify file name
        anchor.href = url;
        document.body.appendChild(anchor);
        anchor.click();
        document.body.removeChild(anchor);
    }
    
    

  • 답변 # 3

    이 기능에 사용하고 있습니다. 먼저 'Accept'헤더를 사용하십시오. 둘째, responseType을 'text'로 설정하면 기본값은 'json'입니다. 셋째, 다운로드 코드입니다.

    getCsv(): Observable<any> {
      let headers = new HttpHeaders();
      headers = headers.set('Accept', 'application/csv');
      return this.http.get('SOME__URL', {
        headers: headers,
        responseType: 'text'
      });
    }
    exportReportCSV() {
      getCsv().subscribe( response => {
        const link = document.createElement('a');
        link.href = window.URL.createObjectURL(new Blob([response], {type: 'text/csv'}));
        link.download = this.report.name + '.csv';
        link.click();
    });
    
    

  • 이전 Spring Framework의로드 시간 제직이 제대로 로깅되지 않음
  • 다음 html - 휴대 기기의 탭에 호버 스타일이 적용되는 이유는 무엇입니까?