为了账号安全,请及时绑定邮箱和手机立即绑定

从 Web API 核心下载文件 - Angular 7

从 Web API 核心下载文件 - Angular 7

C#
哈士奇WWW 2022-10-23 14:08:52
我正在尝试从服务器下载文件,但该文件未显示其原始内容,而是显示 [object Object]。WEB API核心[Authorize(AuthenticationSchemes = "Bearer")][HttpGet]public HttpResponseMessage DownloadContractFile(string fileName){    string contentRootPath = _hostingEnvironment.ContentRootPath;    var folderName = Path.Combine(contentRootPath, FileHandler.ContractFilePath, Convert.ToInt32(User.Identity.Name).ToString());    var path = Path.Combine(folderName, fileName);    var memory = new MemoryStream();    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);    using (var stream = new FileStream(path, FileMode.Open))    {        result.Content = new StreamContent(stream);        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");        result.Content.Headers.ContentDisposition.FileName = Path.GetFileName(path);        result.Content.Headers.ContentType = new MediaTypeHeaderValue(FileHandler.GetContentType(path)); // Text file        result.Content.Headers.ContentLength = stream.Length;        return result;    }}Angular 代码:服务方法  downloadContractFile(fileName: string) {    const obj: any = { fileName: fileName };    const httpParams: HttpParamsOptions = { fromObject: obj } as HttpParamsOptions;    const httpOptions = {      params: new HttpParams(httpParams),      headers: new HttpHeaders({        'Content-Type': 'application/octet-stream',        'Authorization': 'Bearer ' + this.jwt.getToken      })    };       return this.http.get<Array<any>>(`${this.settings.getApiSettings('uri')}/api/contract/DownloadContractFile`, httpOptions).map( /// <<<=== use `map` here      (response) => {        if (response["status"] == 401) {          this.jwt.redirectToLogin();        }        else if (response["status"] < 200 || response["status"] >= 300) {          throw new Error('This request has failed ' + response["status"]);        }        let data = response;        return data;      }    );  }
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

这是我在项目中用来下载文件的代码。


控制器代码:


    [HttpGet("DownloadFile")]

    public async Task<IActionResult> DownloadFile(string fileName = "")

    {

        var response = await DownloadFileFromDatabase(fileName);

        if (response.IsSuccessStatusCode)

        {

            System.Net.Http.HttpContent content = response.Content;

            var contentStream = await content.ReadAsStreamAsync();

            var audioArray = ReadFully(contentStream);

            return Ok(new { response = audioArray, contentType = "audio/wav", fileName });

        }

        else

        {

            throw new FileNotFoundException();

        }

    }

客户端代码:


  HandleBase64  (data , contentType,fileName ){ 

    let byteCharacters = atob(data);    

    let byteNumbers = new Array(byteCharacters.length);    

    for (var i = 0; i < byteCharacters.length; i++) 

        byteNumbers[i] = byteCharacters.charCodeAt(i);


    let byteArray = new Uint8Array(byteNumbers);    

    let blob = new Blob([byteArray], {type: contentType});

    if(contentType === "audio/wav"){

        var blobURL=URL.createObjectURL(blob);

        window.open(blobURL);       

    }

    else{

        var blobURL = window.URL.createObjectURL(blob);

        var anchor = document.createElement("a");

        anchor.download = fileName;

        anchor.href = blobURL;

        anchor.click();

    }

}

您也可以在控制器端使用文件流简单地返回文件。这将自动下载不需要在客户端处理的文件


    return File(stream, "application/octet-stream"); 


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号