Yes, it works if I'm on web browser. here is the public url https://lvnfapi01.digi360.us
Thanks a lot for your help I was finally able to get downloads to work for large files. I eded up using window.location.href=url; instead of location.href= url;
Thanks for your reply, after adding the enc_auth_token I get this error on the netcore end
INFO 2020-08-31 12:02:08,653 [37 ] uthorization.DefaultAuthorizationService - Authorization failed. INFO 2020-08-31 12:02:08,686 [37 ] tion.Cookies.CookieAuthenticationHandler - AuthenticationScheme: Identity.Application was challenged.
I found angular code within the project (file-download.service.ts). The second method is the one I created, when calling this method I get an auth error on the core side.( INFO 2020-08-27 16:54:58,612 [5 ] Microsoft.AspNetCore.Hosting.Diagnostics - Request starting HTTP/2 GET https://localhost:44301/FileManager/GetFile?fileName=lvweb01.zip&fileToken=6c3041bd-a1f6-1634-121d-f0252cb4cb3d
INFO 2020-08-27 16:54:58,632 [5 ] uthorization.DefaultAuthorizationService - Authorization failed). Please advise
**Angular ** export class FileDownloadService {
downloadTempFile(file: FileDto) {
const url = AppConsts.remoteServiceBaseUrl + '/File/DownloadTempFile?fileType=' + file.fileType + '&fileToken=' + file.fileToken + '&fileName=' + file.fileName;
location.href = url; //TODO: This causes reloading of same page in Firefox
}
downloadFiles(fileName: string, fileToken: string) {
const url = AppConsts.remoteServiceBaseUrl + '/FileManager/GetFile?fileName=' + fileName + '&fileToken=' + fileToken;
location.href = url; //TODO: This causes reloading of same page in Firefox
}
} Core public async Task<FileStreamResult> GetFile(string fileName, string fileToken) { Stream stream = null;
string filePath = Path.Combine(_env.WebRootPath, $"Common{Path.DirectorySeparatorChar}", $"Files{Path.DirectorySeparatorChar}", fileToken);
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
var fileStreaResult = new FileStreamResult(stream, "application/pdf");
fileStreaResult.FileDownloadName = fileName;
return fileStreaResult;
}
Hello @musa.demir
I have the below method. The problem is that when I execute the download method it takes a long time to actually see the file start downloading on my screen. After further looking at development tools when executing downloadFile method I see the content in the background transferring as seen below.
once the transfer is complete the code under subscribe executes and I can see the actual file downloading as below
Please advise. I haven't been able to figure how to skip the transfer content as it seems redudant to perform the content transfer and the download.
downlodFile(id): void {
let filedownloadInput = new FileDownloadInput();
filedownloadInput.id = id;
this._FileManagerService.downloadFile(filedownloadInput).subscribe(item => {
this.InitializeDownload(item.fileName, item.fileToken).subscribe((data: any) => {
this.blob = new Blob([data], { type: 'application/pdf' });
var downloadURL = window.URL.createObjectURL(data);
var link = document.createElement('a');
link.href = downloadURL;
link.download = item.fileName;
link.click();
});
});
} InitializeDownload(fileName:string, fileToken:string) { const url = AppConsts.remoteServiceBaseUrl + '/FileManager/GetFile'; this.token = this._tokenService.getToken(); let params = new HttpParams();
params = params.append('fileName', fileName);
params = params.append('fileToken', fileToken);
const httpOptions = {
responseType: 'blob' as 'json',
headers: new HttpHeaders({
"Authorization": "Bearer " + this.token
}),
params: params
};
return this._httpClient.get(url, httpOptions);
}
this was generated with the refresh.bat command.
/**
* @param body (optional)
* @return Success
*/
downloadFile(body: FileDownloadInput | undefined): Observable<FileDownloadOutput> {
let url_ = this.baseUrl + "/api/services/app/FileManager/DownloadFile";
url_ = url_.replace(/[?&]$/, "");
const content_ = JSON.stringify(body);
let options_ : any = {
body: content_,
observe: "response",
responseType: "blob",
headers: new HttpHeaders({
"Content-Type": "application/json-patch+json",
"Accept": "text/plain"
})
};
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => {
return this.processDownloadFile(response_);
})).pipe(_observableCatch((response_: any) => {
if (response_ instanceof HttpResponseBase) {
try {
return this.processDownloadFile(<any>response_);
} catch (e) {
return <Observable<FileDownloadOutput>><any>_observableThrow(e);
}
} else
return <Observable<FileDownloadOutput>><any>_observableThrow(response_);
}));
}
protected processDownloadFile(response: HttpResponseBase): Observable<FileDownloadOutput> {
const status = response.status;
const responseBlob =
response instanceof HttpResponse ? response.body :
(<any>response).error instanceof Blob ? (<any>response).error : undefined;
let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
if (status === 200) {
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
let result200: any = null;
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
result200 = FileDownloadOutput.fromJS(resultData200);
return _observableOf(result200);
}));
} else if (status !== 200 && status !== 204) {
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
}));
}
return _observableOf<FileDownloadOutput>(<any>null);
}
public async Task<FileDownloadOutput> DownloadFile(FileDownloadInput input)
{
var fileInfo = await _filesObjectsRepository.FirstOrDefaultAsync(c => c.Id == input.Id);
var output = new FileDownloadOutput()
{
FileName = fileInfo.FileName,
FileToken = fileInfo.Identifier
};
return output;
}
I no longer get the kestreI error but still get the same result. I can see the content download on dev tools (zone.js as XHR) then once transfer is complete the download starts.
Yes, that worked. I noticed one thing. When I upload a large file it takes a long time before the request is sent to the backend(asp.netcore). what could this be?
Another questions, is it being sent in chunks?