首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试使用angular 5和asp.net内核从数据库下载文件

尝试使用angular 5和asp.net内核从数据库下载文件
EN

Stack Overflow用户
提问于 2019-03-25 20:18:05
回答 1查看 403关注 0票数 0

我正在尝试下载一个已经通过id成功上传到数据库的文件。有人知道需要做些什么才能得到正确的结果吗?

我有一个FileUpload表,其中包含以下列(与文件相关):

代码语言:javascript
复制
Id = uniqueidentifier,
Content = varbinary,
ContentType = nvarchar, e.g. application/pdf
FileName = nvarchar, e.g. filename.pdf
FileType = tinyint 

下面是控制器中的方法。

代码语言:javascript
复制
/// <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,但它不起作用(我只包含了相关代码):

代码语言:javascript
复制
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.`);
        });
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 20:35:38

您的C#代码似乎是正确的,但是您的TypeScript/Angular代码将不会调用您的GetDownloadFile操作。

http.get(...)方法返回一个observable,只有在您订阅它时才会触发该请求。

代码语言:javascript
复制
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所在的目录)中使用以下命令安装包

代码语言:javascript
复制
npm install file-saver --save

然后更新代码以导入并调用file-saver方法来保存文件。

代码语言:javascript
复制
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');
  });
}

希望能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55337627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档