Это работало нормально, но внезапно перестало. История соответствующих файлов не выявила очевидных изменений, которые могли бы это вызвать. Вместо настоящего имени файла, скажем «upload.txt», я получаю GUID без расширения. Таким образом, браузер никогда не сможет открыть файл, как и система, когда он загружает, а не открывает.
Он отправляет имя файла правильно:
На стороне сервера:
[HttpGet("download/{fileId}")]
public async Task<IActionResult> DownloadFile(int fileId)
{
var file = await _fileRepository.GetByIdAsync(fileId).ConfigureAwait(true);
if (file == null)
return NotFound();
var path = _fileService.GetUploadedFilePath(file.FileNameInStorage);
if (!System.IO.File.Exists(path))
return NotFound();
var memory = await PopulateMemoryStream(path).ConfigureAwait(true);
memory.Position = 0;
var contentType = FileUtils.GetContentTypeByExtension(file.Extension);
var displayName = file.OriginalFileName;
if (!Path.HasExtension(displayName))
displayName += file.Extension;
System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
{
FileName = displayName,
Inline = true // false = prompt the user for downloading; true = browser to try to show the file inline
};
Response.Headers.Add("Content-Disposition", cd.ToString());
Response.Headers.Add("X-Content-Type-Options", "nosniff");
return File(memory, contentType, displayName);
}
На стороне клиента:
downloadFile(fileId: number): void {
this.fileService.transmitFile(fileId).subscribe(res => {
const fileURL = URL.createObjectURL(res);
window.open(fileURL, '_blank');
});
}
transmitFile(fileId: number): any {
return this.http.get(`${this.apiUrl}/file/download/${fileId}`, { headers: { 'Accept': 'application/octet-stream' }, observe: 'response', responseType: 'arraybuffer' })
.pipe(
map((res) => {
return new Blob([res.body], { type: res.headers.get('content-type') });
})
);
}