1. 程式人生 > 其它 >Vue與.net Core API 檔案下載

Vue與.net Core API 檔案下載

前端程式碼

 /**
     * @param {Object} data
     * @param {Object} fileName
     * @description 轉換格式後下載
     */
    download(data, fileName) {
      if (!data) return;
      console.log(data);
      const url = window.URL.createObjectURL(new Blob([data]));
      let link = document.createElement('a');
      link.style.display 
= 'none'; link.href = url; link.setAttribute('download', fileName); document.body.appendChild(link); link.click(); }, /** * @description 下載檔案 */ async downFile(row) { const res = await this.$ajax({ method: 'get', url: `/5002/File/down/${row.id}`, responseType:
'blob' }) this.download(res, row.name) },

後端程式碼

 private FileService _fileService;
        /// <summary>
        /// 檔案服務
        /// </summary>
        /// <param name="fileService"></param>
        public FileController(FileService fileService)
        {
            _fileService 
= fileService; } private readonly List<string> Images = new List<string>() { "jpg", "png", "bmp", "jpge" }; private readonly List<string> Files = new List<string>() { "txt", "doc", "docx", "xls", "pdf", "xlsx" }; /// <summary> /// 上傳圖片(JPG,PNG,BMP等圖片檔案) /// </summary> /// <returns></returns> [HttpPost("upload-img")] public async Task<BaseResponse<List<SysFile>>> UploadImg() { var files = Request.Form.Files; if (files.Count == 0) { throw new Exception("沒有上傳檔案"); } foreach(var file in files) { var fileName = Path.GetFileName(file.FileName); //取得檔案的副檔名 var fileExtension = Path.GetExtension(fileName).ToLower(); if (string.IsNullOrEmpty(fileExtension)) { throw new Exception("對不起,只能上傳圖片檔案"); } fileExtension = fileExtension.Replace(".", ""); if (!Images.Contains(fileExtension)) { throw new Exception($"對不起,只能上傳圖片格式檔案,檔案型別為 [ {string.Join(",", Images)} ] 中的一種"); } } var result = await this.Upload("img", files); return BaseResponse.GetResult(result); } /// <summary> /// 上傳檔案(PDF,WORD,EXCEL,TXT等非圖片類檔案) /// </summary> /// <returns></returns> [HttpPost("upload-file")] public async Task< BaseResponse<List<SysFile>>> UploadFile() { var files = Request.Form.Files; if (files.Count == 0) { throw new Exception("沒有上傳檔案"); } foreach (var file in files) { var fileName = Path.GetFileName(file.FileName); //取得檔案的副檔名 var fileExtension = Path.GetExtension(fileName).ToLower(); if (string.IsNullOrEmpty(fileExtension)) { throw new Exception("對不起,只能上傳文件類檔案"); } fileExtension = fileExtension.Replace(".", ""); if (!Files.Contains(fileExtension)) { throw new Exception($"對不起,只能上傳文件格式檔案,檔案型別為 [ {string.Join(",", Files)} ] 中的一種"); } } var result = await this.Upload("file", files); return BaseResponse.GetResult(result); } /// <summary> /// 上傳 並將記錄儲存到資料庫中 /// </summary> /// <param name="type"></param> /// <param name="files"></param> /// <returns></returns> private async Task<List<SysFile>> Upload(string type,IFormFileCollection files) { List<SysFile> result = new List<SysFile>(); string dir = DateTime.Now.ToString("yyyyMMdd"); string savePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "upload", type, dir); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } foreach (var file in files) { if (file.Length > 0) { string fileName, fileExtension; //取得上傳得檔名 fileName = Path.GetFileName(file.FileName); //取得檔案的副檔名 fileExtension = Path.GetExtension(fileName).ToLower(); string newFileName = $"{ Guid.NewGuid().ToString()}{ fileExtension}"; using (var stream = new FileStream(Path.Combine(savePath, newFileName), FileMode.Create)) { file.CopyToAsync(stream).Wait(); var filePath = $"/upload/{type}/{dir}/{newFileName}"; result.Add(new SysFile() { FileEx = fileExtension, FileName = fileName, Path = filePath, UploadUser = User.Identity.Name }); } } } result = await _fileService.CreateAsync(result); return result; } /// <summary> /// 獲取檔案詳情 /// </summary> /// <param name="id">SysFile.ID</param> /// <returns></returns> [HttpGet("file-info/{id}")] public BaseResponse<SysFile> GetFileInfo(string id) { var file = _fileService.Get(id); return BaseResponse.GetResult(file); } /// <summary> /// 檔案下載 /// </summary> /// <param name="id">SysFile.ID</param> /// <returns>application/octet-stream</returns> [HttpGet("down/{id}")] public IActionResult Down(string id) { var file = _fileService.Get(id); var paths = file.Path.Split("/").ToList(); paths.Remove(paths.First()); paths.Insert(0, AppContext.BaseDirectory); paths.Insert(1, "wwwroot"); var filePath = Path.Combine(paths.ToArray()); if (System.IO.File.Exists(filePath)) { return PhysicalFile(filePath, "application/octet-stream", file.FileName); } else { throw new Exception($"下載失敗!未能找到指定檔案,檔案ID:{id},Path:{file.Path}"); } } }