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

我正在尝试从服务器下载文件,但该文件未显示其原始内容,而是显示 [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;

      }

    );


  }


哈士奇WWW
浏览 106回答 1
1回答

精慕HU

这是我在项目中用来下载文件的代码。控制器代码:&nbsp; &nbsp; [HttpGet("DownloadFile")]&nbsp; &nbsp; public async Task<IActionResult> DownloadFile(string fileName = "")&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var response = await DownloadFileFromDatabase(fileName);&nbsp; &nbsp; &nbsp; &nbsp; if (response.IsSuccessStatusCode)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.Net.Http.HttpContent content = response.Content;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var contentStream = await content.ReadAsStreamAsync();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var audioArray = ReadFully(contentStream);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Ok(new { response = audioArray, contentType = "audio/wav", fileName });&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new FileNotFoundException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }客户端代码:&nbsp; HandleBase64&nbsp; (data , contentType,fileName ){&nbsp;&nbsp; &nbsp; let byteCharacters = atob(data);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; let byteNumbers = new Array(byteCharacters.length);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; for (var i = 0; i < byteCharacters.length; i++)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; byteNumbers[i] = byteCharacters.charCodeAt(i);&nbsp; &nbsp; let byteArray = new Uint8Array(byteNumbers);&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; let blob = new Blob([byteArray], {type: contentType});&nbsp; &nbsp; if(contentType === "audio/wav"){&nbsp; &nbsp; &nbsp; &nbsp; var blobURL=URL.createObjectURL(blob);&nbsp; &nbsp; &nbsp; &nbsp; window.open(blobURL);&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; else{&nbsp; &nbsp; &nbsp; &nbsp; var blobURL = window.URL.createObjectURL(blob);&nbsp; &nbsp; &nbsp; &nbsp; var anchor = document.createElement("a");&nbsp; &nbsp; &nbsp; &nbsp; anchor.download = fileName;&nbsp; &nbsp; &nbsp; &nbsp; anchor.href = blobURL;&nbsp; &nbsp; &nbsp; &nbsp; anchor.click();&nbsp; &nbsp; }}您也可以在控制器端使用文件流简单地返回文件。这将自动下载不需要在客户端处理的文件&nbsp; &nbsp; return File(stream, "application/octet-stream");&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP