vue 下载文件

/// <summary>
        /// 获取文件信息
        /// </summary>
        /// <param name="token">登录Token</param>
        /// <returns></returns>
        [HttpGet]
        public HttpResponseMessage fileDownload(String token, String url, Boolean bTemp = false)
        {
            Object result = null;
            String tempPath = String.Empty;
            String temPath1 = String.Empty;
            try
            {
                LoginUser loginUser = GetCurrentLoginUser(token);
                String file = HttpContext.Current.Request.MapPath(url);
                tempPath = HttpContext.Current.Request.MapPath(String.Format("/upload/Temp/{0}/", loginUser.Uid));
                temPath1 = String.Format("{0}/Template/", tempPath);
                FileInfo fileInfo = new FileInfo(file);
                if (!Directory.Exists(temPath1))
                {
                    Directory.CreateDirectory(temPath1);
                }
                fileInfo.CopyTo(temPath1 + fileInfo.Name);

                using (FileStream filestream = new FileStream(temPath1 + fileInfo.Name, FileMode.Open))
                {
                    byte[] bt = new byte[filestream.Length];

                    //调用read读取方法
                    filestream.Read(bt, 0, bt.Length);
                    var base64Str = Convert.ToBase64String(bt);

                    result = new { name = Path.GetFileName(file), dataStr = base64Str };
                }
                String[] strs = url.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                String fileName = strs[strs.Length - 1];
                String msg = String.Empty;
                if (bTemp)
                {
                    msg = String.Format("用户【{0}】下载了模板文件【{1}】", loginUser.User.FullName, fileName);
                }
                else
                {
                    String pjName = strs[1] + "-" + strs[2];
                    String moduleName = strs.Length > 3 ? strs[strs.Length - 3] : "";
                    msg = String.Format("用户【{0}】下载了项目【{1}】的【{2}】文件【{3}】", loginUser.User.FullName, pjName, moduleName, fileName);
                }
                LogHelper.LogOperate(msg, Constant.OPEARTE_LOG_INFO, loginUser);
            }
            catch (Exception ex)
            {
                AppLog.Error(ex);
                return JsonResultModel(Result_Error, ex.Message, null);
            }
            finally
            {
                if (!String.IsNullOrEmpty(temPath1))
                {
                    // 删除临时文件夹
                    Directory.Delete(temPath1, true);
                }
            }

            return JsonResultModel(Result_Success_Code, Result_Success_MSG, result);
        }

  

// 下载文件
export function fileDownload(params) {
  return request({
    url: '/Common/fileDownload',
    method: 'get',
    params
  })
}

  

    downLoadFile(row) {
      var ext = extName(row.name).toLocaleLowerCase()
      if (ext === 'jpg' || ext === 'jpeg' || ext === 'png' || ext === 'jfif') {
        this.dialogImageUrl = row.webUrl
        this.imgViewDialogVisible = true
      } else {
        var param = {
          token: getToken(),
          url: row.url
        }
        fileDownload(param).then(res => {
          if (res.code === 20000) {
            downloadFile(res.data.name, res.data.dataStr)
          }
        })
      }
    }

  

/*
* 下载文件
*/
export function downloadFile(fileName, content) {
  const aLink = document.createElement('a')
  const blob = base64ToBlob(content) // new Blob([content]);

  const evt = document.createEvent('HTMLEvents')
  evt.initEvent('click', true, true)// initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
  aLink.download = fileName
  aLink.href = URL.createObjectURL(blob)

  // aLink.dispatchEvent(evt);
  aLink.click()
}

// base64转blob
export function base64ToBlob(code) {
  const parts = code.split(';base64,')
  const contentType = parts[0].split(':')[1]
  const raw = window.atob(parts[0])
  const rawLength = raw.length

  const uInt8Array = new Uint8Array(rawLength)

  for (let i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i)
  }
  return new Blob([uInt8Array], { type: contentType })
}