.Net MVC 下载网站的文件

前言

上传文件我使用的是Bootstrap的插件FileInput,这个抽时间看看写个博客

现在下载我遇到坑了,而这个坑,我以前踩过.....

C#文件的下载

网上一搜,大把,下面的代码也是我复制网上的,怎么都不行

FileInfo fileInfo = new FileInfo("C:\Users\Justin\Desktop\学习\20190528102940089.pdf");
            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();
            Response.AddHeader("Content-Disposition", "attachment;filename=" + "20190528102940089.pdf");
            Response.AddHeader("Content-Length", fileInfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/octet-stream";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
            Response.WriteFile(fileInfo.FullName);
            Response.Flush();
            Response.End();

然后我新建了个项目,把上面的代码复制进去,行了.....

我对比了一下我的项目,我居然又犯了以前踩过的一个坑,我不知道ajax不能请求下载方法!!!

ajax

ajax的返回值类型是json,text,html,xml类型,所以ajax请求的方法返回的基本上都是json格式,然而我访问的是下载方法,返回的是文件流......

返回文件路径,使用window.open打开

改版思路,使用ajax获取文件的路径,然后使用window.open打开,这里又遇到一个问题,window.open不能打开本地路径,比如D盘下的某个文件,因为js是拒绝访问磁盘的,那就换成网站路径咯

var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var pos = curWwwPath.indexOf(pathName);
var localhostPaht = curWwwPath.substring(0, pos);
//这个localhostPaht就是你的网站的网址

//然后在ajax的success方法里面直接打开
 window.open(localhostPaht + data.ReturnData.filePath);

这里的ReturnData就是一个json返回类,可以携带一些Model类,如下

using System;
using System.Collections.Generic;
using System.Text;

namespace test.Model
{
	public enum ReturnStatus
	{
		FAILED=0,
		SUCCEED =1,
		WARNNING=2
	}
	/// <summary>
	/// 返回信息提示
	/// </summary>
	public class ReturnValue
    {
        public ReturnValue() { }

        public ReturnValue(ReturnStatus status, object returnData, string message)
        {
			Status = status;
            ReturnData = returnData;
			Message = message;
        }

        public ReturnValue(ReturnStatus status, string message)
        {
			Status = status;
			Message = message;
        }

		/// <summary>
		/// 默认失败
		/// </summary>
		/// <param name="result"></param>
        public ReturnValue(string message)
        {
			Status = ReturnStatus.FAILED;
			Message = message;
        }

		/// <summary>
		/// 状态
		/// </summary>
        public ReturnStatus Status { get; set; }

        /// <summary>
        /// 数据对象
        /// </summary>
        public object ReturnData { get; set; }

        /// <summary>
        /// 接口访问错误的时候返回的错误提示文字,访问成功的时候为空字符串
        /// </summary>
        public string Message { get; set; } = "";
    }
}

Controller返回也很简单

 return Json(new ReturnValue(ReturnStatus.SUCCEED, new { filePath= filePath }, "下载成功"), JsonRequestBehavior.AllowGet);
原文地址:https://www.cnblogs.com/yunquan/p/11054487.html