我正在尝试下载一个已经通过id成功上传到数据库的文件。有人知道需要做些什么才能得到正确的结果吗?
我有一个FileUpload表,其中包含以下列(与文件相关):
Id = uniqueidentifier,
Content = varbinary,
ContentType = nvarchar, e.g. application/pdf
FileName = nvarchar, e.g. filename.pdf
FileType = tinyint 下面是控制器中的方法。
/// <summary>
/// Download the file from the database by id.
/// </summary>
/// <param name="id">The identifier.</param>
/// <returns>The file.</returns>
[HttpGet]
public async Task<ActionResult> GetDownloadFile(Guid id)
{
if (id == null)
{
throw new UserFriendlyException("File not found.");
}
var file = await _fileUploadRepository.FirstOrDefaultAsync(id);
var filename = file.FileName.ToString();
var fileBytes = file.Content;
return File(fileBytes, file.ContentType,file.FileName);
}下面是尝试调用控制器的typescript,但它不起作用(我只包含了相关代码):
constructor(
injector: Injector,
private _fileUploadsServiceProxy: FileUploadsServiceProxy,
private _notifyService: NotifyService,
private _tokenAuth: TokenAuthServiceProxy,
private _activatedRoute: ActivatedRoute,
private _fileDownloadService: FileDownloadService,
private _searchService: SearchService,
private http: Http
) {
super(injector);
}
/// <summary>
/// Download the file from the database.
/// </summary>
///<param name="file">The file.</param>
downloadFile(file: any): void {
if (file.fileUpload.id) {
var headers = new Headers();
headers.append('Content-Type', file.fileUpload.contentType);
headers.append('Authorization', 'Bearer ' + abp.auth.getToken());
this.http.get(`${AppConsts.remoteServiceBaseUrl}/FileUploadComponents/DownloadFile?id= ${file.fileUpload.id}`, {
headers: headers,
responseType: ResponseContentType.Blob
})
.subscribe(result => {
saveAs(result.blob(), file.fileUpload.fileName);
this.notify.success(`Downloaded ${file.fileUpload.fileName} successfully.`);
});
}
}发布于 2019-03-25 20:35:38
您的C#代码似乎是正确的,但是您的TypeScript/Angular代码将不会调用您的GetDownloadFile操作。
http.get(...)方法返回一个observable,只有在您订阅它时才会触发该请求。
public downloadFile(id: number): void {
var headers = new Headers();
headers.append('Content-Type', 'application/octetstream');
headers.append('Authorization', 'Bearer ' + abp.auth.getToken());
this.http.get(`${AppConsts.remoteServiceBaseUrl}/FileUploadComponents/DownloadFile?id= ${id}`)
.subscribe(result => {
// result contains your file data.
});
}现在,您需要保存您的文件,您可以使用file-saver包。
在您的项目根目录( package.json所在的目录)中使用以下命令安装包
npm install file-saver --save然后更新代码以导入并调用file-saver方法来保存文件。
import { saveAs } from 'file-saver';
public downloadFile(id: number): void {
var headers = new Headers();
headers.append('Content-Type', 'application/octetstream');
headers.append('Authorization', 'Bearer ' + abp.auth.getToken());
this.http.get(`${AppConsts.remoteServiceBaseUrl}/FileUploadComponents/DownloadFile?id= ${id}`).subscribe(result => {
saveAs(result, 'fileName');
});
}希望能有所帮助。
https://stackoverflow.com/questions/55337627
复制相似问题