From e4a3cc959700c270f69e05b87944725f684077df Mon Sep 17 00:00:00 2001 From: dev01 Date: Wed, 14 Dec 2022 17:34:13 +0800 Subject: [PATCH] =?UTF-8?q?[Frontend][=E5=9C=96=E8=B3=87=E7=AE=A1=E7=90=86?= =?UTF-8?q?]=20=E4=B8=8B=E8=BC=89dwg=E6=AA=94=E7=A8=8B=E5=BA=8F=E8=AA=BF?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Frontend/_graphManagement.html | 12 ++++--- Frontend/index.html | 1 + Frontend/js/style.js | 3 +- .../ApiControllers/FileController.cs | 35 +++++++++++-------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Frontend/_graphManagement.html b/Frontend/_graphManagement.html index 5038f0e..b17cec6 100644 --- a/Frontend/_graphManagement.html +++ b/Frontend/_graphManagement.html @@ -139,6 +139,8 @@ var uploader = {}; var uploadFiles = {}; var curActGraid = 0; + var cookies = new YourTeam.Utility.Cookie(); + var token = cookies.get("JWT-Authorization"); $(function () { initList(); initDropzone(); @@ -283,19 +285,21 @@ }) onEvent("click", "a[id^=oriDwgDown]", function () { - let cookies = new YourTeam.Utility.Cookie(); let rowData = graTable.row($(this).closest("tr")).data(); let apiUrl = baseApiUrl + `/File/Download?type=graph&savename=${rowData.oriSavName}&oriname=${rowData.oriOrgName}`; let extname = rowData.oriOrgName?.split(".").slice(-1) || "dwg"; - download(cookies.get("JWT-Authorization"), apiUrl, rowData.name + "_原設計圖" + "." + extname); + download(token, apiUrl, rowData.name + "_原設計圖" + "." + extname, function () { + + }); }) onEvent("click", "a[id^=donDwgDown]", function () { - let cookies = new YourTeam.Utility.Cookie(); let rowData = graTable.row($(this).closest("tr")).data(); let apiUrl = baseApiUrl + `/File/Download?type=graph&savename=${rowData.donSavName}&oriname=${rowData.donOrgName}`; let extname = rowData.donOrgName?.split(".").slice(-1) || "dwg"; - download(cookies.get("JWT-Authorization"), apiUrl, rowData.name + "_竣工圖" + "." + extname); + download(token, apiUrl, rowData.name + "_竣工圖" + "." + extname, function () { + + }); }) // 上傳檔案 diff --git a/Frontend/index.html b/Frontend/index.html index 346e909..44799d0 100644 --- a/Frontend/index.html +++ b/Frontend/index.html @@ -2292,6 +2292,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li }) endPageLoading(); + $(".yt-alert").YTAlert().hide(); if (typeof timeOuters != "undefined") { $.each(timeOuters, (idx, timeOut) => { diff --git a/Frontend/js/style.js b/Frontend/js/style.js index 922dbf9..77997b2 100644 --- a/Frontend/js/style.js +++ b/Frontend/js/style.js @@ -1349,7 +1349,7 @@ function toBool(boolstr) { * @param {any} url * @param {any} filename */ -async function download(token,url, filename) { +async function download(token,url, filename,callback = null) { let toDataURL = function (url) { return fetch(url, { @@ -1378,6 +1378,7 @@ async function download(token,url, filename) { document.body.appendChild(a); a.click(); document.body.removeChild(a); + callback ? callback() : ""; return true; } else { return false; diff --git a/FrontendWebApi/ApiControllers/FileController.cs b/FrontendWebApi/ApiControllers/FileController.cs index 7e257b5..37bf1bc 100644 --- a/FrontendWebApi/ApiControllers/FileController.cs +++ b/FrontendWebApi/ApiControllers/FileController.cs @@ -8,6 +8,10 @@ using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.IO; using System.Net; +using System.Web; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http.Features; +using NPOI.HPSF; namespace FrontendWebApi.ApiControllers { @@ -27,7 +31,7 @@ namespace FrontendWebApi.ApiControllers graphManageFileSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "graph_manage"); operationFileSaveAsPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "upload", "operation"); } - public bool Download([FromQuery]string type , string savename, string oriname) + public ActionResult Download([FromQuery]string type , string savename) { var path = ""; if (type == "graph") @@ -43,26 +47,27 @@ namespace FrontendWebApi.ApiControllers { try { - FileInfo xpath_file = new FileInfo(path); //要 using System.IO; - - // 將傳入的檔名以 FileInfo 來進行解析(只以字串無法做) - HttpContext.Response.Clear(); //清除buffer - HttpContext.Response.ContentType = "application/octet-stream"; - // 檔案類型還有下列幾種"application/pdf"、"application/vnd.ms-excel"、"text/xml"、"text/HTML"、"image/JPEG"、"image/GIF" - HttpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(oriname, System.Text.Encoding.UTF8)); - // 考慮 utf-8 檔名問題,以 out_file 設定另存的檔名 - HttpContext.Response.Headers.Add("Content-Length", xpath_file.Length.ToString()); //表頭加入檔案大小 - HttpContext.Response.SendFileAsync(xpath_file.FullName); - - return true; + var auth = HttpContext.Request.Headers["Authorization"]; + var token = auth.ToString()?.Split("Bearer ")[1]; + var jwt = new JwtSecurityTokenHandler().ReadJwtToken(token); + if (jwt == null) + return Unauthorized(HttpStatusCode.Unauthorized); + else if (!System.IO.File.Exists(path)) + return NotFound("找不到文件"); + var bufferingFeature = HttpContext.Features.Get(); + bufferingFeature?.DisableBuffering(); + var content = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); + var response = File(content, "application/octet-stream");//FileStreamResult + + return response; } catch (Exception) - { return false; } + { return null; } } else - return false; + return null; } [HttpGet]