python-3.x Angular:如何在客户端将服务器生成的文件导出为CSV?

cs7cruho  于 2023-05-23  发布在  Python
关注(0)|答案(1)|浏览(116)

由于response.body未定义,下面的Angular代码导出一个空的csv文件

import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpHeaders, HttpResponse } from '@angular/common/http';
import { saveAs } from 'file-saver';

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

  constructor(private http: HttpClient) { }

  download_adhoc_report(endpoint, params, url, report_name = 'data.csv') {
    const httpOptions = {
      responseType: 'arraybuffer' as 'json',
      headers: new HttpHeaders({
        'Content-Type': 'application/json'
      }),
      params: new HttpParams()
    };
    if (params) {
      httpOptions.params = new HttpParams();
      for (let k in params) {
        httpOptions.params = httpOptions.params.set(k, params[k]);
      }
    }
    

//    ISSUE COMES HERE

    this.http.get(url + endpoint, httpOptions).subscribe((response: HttpResponse<ArrayBuffer>) => {
      const blob = new Blob([response.body], { type: 'text/csv' }); //HERE response.body is UNDEFINED
      saveAs(blob, report_name);
    }, error => {
      console.error('File download failed:', error);
    });
  }
}

console.log(response)返回:

服务器端代码:

import azure.functions as func
from ..shared import blobOps

def main(req: func.HttpRequest) -> func.HttpResponse:
    
    
    report_path = req.params.get('output_filePath') + req.params.get('output_fileName')

    try:
        
        with open(req.params["LOCALFILENAME"], "r") as my_blob2:
           file = my_blob2.read()
       
        headers = {
                "Content-Disposition": "attachment; filename=data.csv",
                "Content-Type": "text/csv"
            }
        
        return func.HttpResponse(file, headers=headers, status_code=200)
    
    except Exception as e:
        print(e)
        return func.HttpResponse("Error : File not found", status_code=404)

来自服务器的响应不是空的(并且似乎包含所需的数据),所以我的猜测是问题在于响应类型或读取的方式。
将非常感谢任何关于如何解决这个问题的提示。

shyt4zoc

shyt4zoc1#

要将文件下载为csv,我将使用以下工作:

`
     download_adhoc_report(endpoint, params, url, report_name = 'data.csv') {
       return this.httpClient
            .get(endpoint, {
                headers,
                responseType: 'arraybuffer',
                params: params,
            })
            .subscribe((response) =>
                this.downloadFile(
                    response,
                    `text/csv`,
                    report_name
                )
            ); 
    }
      downloadFile(data: any, type: string, filename: string) {
            let blob = new Blob([data], { type: type });
            let url = window.URL.createObjectURL(blob);
            let a = window.document.createElement('a');
            a.href = url;
            a.download = filename;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
        }
    `

downloadFile方法将创建一个带有下载链接的标记元素,该链接是使用createObjectURL方法创建的,并在其上模拟一个单击事件

相关问题