1. 程式人生 > 實用技巧 >下載檔案(API介面,Angularjs前端)

下載檔案(API介面,Angularjs前端)

最近在專案中,實現web api檔案下載功能。

檔案是儲存於資料庫中。

檔案內容是vbinary資料型別,當然資料型別為image也沒有問題的。

參考下面程式碼示例:

 [HttpPost]
        public async Task<HttpResponseMessage> DownloadFile(JObject jObj)
        {
            var jsonStr = JsonConvert.SerializeObject(jObj);
            var jsonParams = JsonConvert.DeserializeObject<dynamic
>(jsonStr); BarCode bc = new BarCode(); bc.BarCode_nbr = jsonParams.BarCode_nbr; BarCodeEntity bce = new BarCodeEntity(); var barcode = bce.BarCodes(bc).FirstOrDefault(); HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
string physicalPath = HttpContext.Current.Server.MapPath("~/Temp/") + barcode.FileName; byte[] buffer = (byte[])barcode.QrCode; if (!File.Exists(physicalPath)) { using (FileStream fileStream = File.Create(physicalPath)) { fileStream.Write(buffer,
0, buffer.Length); } } response.Content = new ByteArrayContent(buffer); response.Content.Headers.ContentLength = buffer.LongLength; response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); response.Content.Headers.ContentDisposition.FileName = barcode.FileName; response.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(barcode.FileName)); return await Task.FromResult(response); }
Source Code

然後,前端是呼叫介面:

var arg = {};
            arg.BarCode_nbr = qr.BarCode_nbr;

            fetch('/api/IoSvc/DownloadFile', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(arg),
            })
                .then(res => res.blob())
                .then(data => {
                    let blobUrl = window.URL.createObjectURL(data);
                    const a = document.createElement('a');
                    a.style.display = 'none';
                    a.download = qr.FileName;
                    a.href = blobUrl;
                    a.click();
                });
Source Code

效果: