Pro*_*Sky 5 c# filesaver.js asp.net-core angular
我有一个角度应用程序,其中一个网格具有带有指向 csv 文件的超链接的列。该 csv 位于网络驱动器上。
当用户单击链接时,他们应该能够将文件保存到他们的计算机上(假设所有用户都有权访问)。
我正在使用文件保护程序来下载/保存文件。
这是我的 C# 核心 api 控制器。为了测试,我有硬编码的文件名c:\temp\test.csv。在实际应用中,Angular 将使用所需的文件(包括完整路径)调用 api。
[HttpGet("DownLoadFile/{fileName}")]
public HttpResponseMessage DownLoadFile( string fileName)
        {
            try
            {
                fileName = @"c:\temp\test.csv"; //Hard Coding for testing only. 
                if (!string.IsNullOrEmpty(fileName))
                {
                        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                        var fileStream = new FileStream(fileName, FileMode.Open);
                        response.Content = new StreamContent(fileStream);
                        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
                        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                        response.Content.Headers.ContentDisposition.FileName = fileName;
                        return response;
                        //return ResponseMessage(response);
                }
                return new HttpResponseMessage(HttpStatusCode.NotFound);
            }
            catch (Exception ex)
            {
                return new HttpResponseMessage(HttpStatusCode.NotFound);
            }
        }
角度服务:
public getFile(filePath:string): Observable<Blob>{
    console.log(filePath);
    let path = 'http://localhost:19090/api/testAPI/DownLoadFile/testfile.csv';
    let options = new RequestOptions({responseType: ResponseContentType.Blob });
    return this._http.get(path, {responseType: 'blob'})
    .pipe(
      catchError(this.handleError));
  }
组件代码: 我的应用程序使用 Kendo Grid。
private downloadFile( dataItem: any):void{
  this._sharedService.getFile(dataItem.test_file)
  .subscribe(
     (data:Blob) => {
       saveAs(data, `Test_1.csv`); // from file-saver library
      },
     (err: any) => {
        console.log(`Unable to save file ${JSON.stringify(err)}`)}
    );
}
此代码确实下载了 csv 文件,但它显示为:
   {"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1},"content":{"headers":[{"key":"Content-Type","value":["text/csv"]},{"key":"Content-Disposition","value":["attachment; filename=\"c:\\temp\\blaze.csv\""]}]},"statusCode":200,"reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}
我究竟做错了什么?有什么指点吗?
这些是我用来排除故障的一些链接:
使用 Web Api 2 Angular 下载 csv 文件
更新:
我能够解决我的问题。我更新了我的控制器代码,并且可以下载该文件。
根据我的更新,我能够更新我的控制器,这解决了我的问题。客户端代码没有变化。
public async Task<IActionResult> DownloadFile(string filename)
        {
            try
            {
                string file = @"c:\temp\test.csv";
                var memory = new MemoryStream();
                using (var stream = new FileStream(file, FileMode.Open))
                {
                    await stream.CopyToAsync(memory);
                }
                memory.Position = 0;
                return File(memory, GetMimeType(file), filename);
            }
            catch (Exception e)
            {
                return BadRequest(e);
            }
        }