1. 程式人生 > >WebAPI返回檔案下載連結

WebAPI返回檔案下載連結

遇到一個需求,即通過介面從SDE中下載資料到臨時的MDB中,返回前端一個http下載連結,讓前端可以通過該連結獲得MDB檔案。於是,我們在網站根目錄(即與App_Data、web.config同級目錄)中建立一個TempData目錄,用於儲存下載後的臨時MDB檔案,再通過解析呼叫請求,獲得IP與埠,與該路徑拼接成一個下載連結。

程式碼如下:

        /// <summary>
        /// 測試:返回路徑
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ResponseType(typeof(string))]
        public IHttpActionResult Parse()
        {
            var sPath = @"E:\Code\MyTest\WebApplication2\WebApplication2\TempData\abc.mdb";
            //var sPath = @"~\TempData\abc.doc";

            if (sPath.IndexOf("~") == 0)
                sPath = HostingEnvironment.MapPath(sPath); //轉為絕對路徑
            //取得當前網站的絕對路徑
            var sRootePath = HostingEnvironment.MapPath(HostingEnvironment.ApplicationVirtualPath);
            //取得檔案相對於網站的路徑(如:TempData/abc.mdb)
            var sRelativeUri = new Uri(sRootePath, UriKind.Absolute).MakeRelativeUri(new Uri(sPath, UriKind.Absolute)).ToString();
            // 先判斷是否與原路徑相同,如相同則表示二者可能不在同一個磁碟上
            var sResult = (0 == string.Compare(Path.GetFullPath(sRelativeUri), Path.GetFullPath(sPath), StringComparison.OrdinalIgnoreCase))
                ? null : $"http://{HttpContext.Current.Request.Url.Authority}/{sRelativeUri}"; //構造返回路徑
            return Json(sResult);
        }

呼叫時,返回的結果為:

"http://localhost:6730/TempData/abc.mdb"