У меня есть угловое приложение, где одна из сеток имеет столбец с гиперссылкой на CSV-файл.Этот CSV находится на сетевом диске.
Когда пользователь щелкает ссылку, он должен иметь возможность сохранить файл на своем компьютере (при условии, что все пользователи имеют доступ).
Я использую file-saver для загрузки / сохранения файла.
Это мой c # core 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);
}
}
Служба Angular:
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}
Что я делаю не так?Есть указатели?
Вот некоторые ссылки, которые я использовал для устранения неполадок:
Как загрузить файл с Angular2
Angular загрузить CSV-файлс Web Api 2
ОБНОВЛЕНИЕ:
Благодаря этой ссылке - https://expertcodeblog.wordpress.com/2018/08/13/asp-net-core-angular-how-to-download-file-from-api-controller/
Мне удалось решить моюпроблема.Я обновил свой код контроллера и смог загрузить файл.