Web下载文件(导出)

MVC 实现将数据库的内容(查询结果导出)

1 (以流的形式返回给前端,导出文件),文件内容是动态查询生成的

1.1数据处理

        /// <summary>
        ///  输出硬盘文件,提供下载 支持大文件、续传、速度限制、资nse, string _fileName, StringBuilder data, long _speed)
        {
            try源占用小
        /// </summary>
        /// <param name="_Request">Page.Request对象</param>
        /// <param name="_Response">Page.Response对象</param>
        /// <param name="_fileName">下载文件名</param>
        /// <param name="_data">数据(可变字符串)</param>
        /// <param name="_speed">每秒允许下载的字节数</param>
        /// <returns>返回是否成功</returns>
        public static bool ResponseFile(HttpRequestBase _Request, HttpResponseBase _Response, string _fileName, StringBuilder data, long _speed)
        {
            try
            {
                //用BinaryReader 读取某个路径下的文件流
                //FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                // BinaryReader br = new BinaryReader(myFile);
               //用BinaryReader读取字节数组
                StringBuilder strbData = new StringBuilder();
               // byte[] shuzu = Encoding.Unicode.GetBytes(data.ToString());
               ##byte[] shuzu = Encoding.UTF8.GetBytes(data.ToString()); //替换上面的(解决导出csv文件表头 中文乱码的问题)**
                MemoryStream myData = new MemoryStream(shuzu);
                BinaryReader br = new BinaryReader(myData);
                try
                {
                    _Response.AddHeader("Accept-Ranges", "bytes");
                    _Response.Buffer = false;
                    //long fileLength = myFile.Length;
                    long fileLength = myData.Length;
                    long startBytes = 0;
                    int pack = 10240; //10K bytes
                    //int sleep = 200;   //每秒5次   即5*10K bytes每秒
                    int sleep = (int)Math.Floor((double)(1000 * pack / _speed)) + 1;
                    if (_Request.Headers["Range"] != null)
                    {
                        _Response.StatusCode = 206;
                        string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
                        startBytes = Convert.ToInt64(range[1]);
                    }
                    _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
                    if (startBytes != 0)
                    {
                        _Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
                    }
                    _Response.Charset = "gb2312";
                    _Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                    _Response.AddHeader("Connection", "Keep-Alive");
                    _Response.ContentType = "application/octet-stream";
                    _Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName + ".csv", System.Text.Encoding.GetEncoding("gb2312")));
                    _Response.HeaderEncoding = System.Text.Encoding.GetEncoding("gb2312");//表头添加编码格式

                    br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                    int maxCount = (int)Math.Floor((double)((fileLength - startBytes) / pack)) + 1;
                    for (int i = 0; i < maxCount; i++)
                    {
                        if (_Response.IsClientConnected)
                        {
                            _Response.BinaryWrite(br.ReadBytes(pack));
                            Thread.Sleep(sleep);
                        }
                        else
                        {
                            i = maxCount;
                        }
                    }
                }
                catch
                {
                    return false;
                }
                finally
                {
                    br.Close();
                    myData.Close();
                }
            }
            catch
            {
                return false;
            }
            return true;
        }

1.2 Controller层

[HttpGet]
        public ActionResult ExportCard(string customerId,string contractId,string fileName)
        {

            CardModel cardModel = new CardModel();
            List<Card> listData= cardModel.GetByInfo(customerId,contractId);
            StringBuilder strData = new StringBuilder();

            try
            {
                strData.Append("序号"+",");
                strData.Append("WTP号" + ",");
                strData.Append("CardId");
                strData.Append("\n");
                int i=0;
                foreach (var item in listData)
                {
                    strData.Append(i++);
                    strData.Append(",");
                    strData.Append(item.Code+",");
                    strData.Append(item.CardId);
                    strData.Append("\n");
                }

                bool flag = ImportExport.ResponseFile(Request, Response, fileName, strData,1024000);

                if (true)
                {
                    return Json(new { Success = true, Message = "导入成功!" });
                }
                else
                {
                    return Json(new { Success = false, Message = "导入失败!" });
                }

            }
            catch (Exception ex)
            {
                ServiceGlobal.CallInLog.Error(string.Format("ResponseError: {0}",ex.Message));
                return Json(new { Success = false, Message = "导入失败!" });
            }
        }

1.3前端代码

 location.href = "@Url.Action("ExportCard", "Card")" + "?" + "customerId=" + $("#CardCustomerId").val() + "&contractId=" + $("#ContractId").val() + "&fileName=" + $("#fileName").val();
或
var url="@Url.Action("ExportCard", "Card")" + "?" + "customerId=" + $("#CardCustomerId").val() + "&contractId=" + $("#ContractId").val() + "&fileName=" + $("#fileName").val();

            var alink = document.createElement("a");
            alink.download = $("#fileName").val();
            alink.style.display = "none";
            alink.href = url;
            document.body.appendChild(alink);
            alink.click();
            document.body.removeChild(alink);

            $('#myModal').modal('hide'); //弹出框dilog

2 <a>标签下载文件

下载的文件是在服务器端指定目录下(静态文件),也可以接受后端返回的文件流

创建a标签访问
<a href="后端接口地址"、url>下载文件</a>
触发a的click事件

3 form表单提交下载

form表单提交,接受后端返回的文件流

参考:

Web端下载文件的几种方式
[https://www.jianshu.com/p/bf0a4e3926a4]

前端接收文件流 并 下载的几种方式
[https://blog.csdn.net/weixin_33910385/article/details/88702258]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,093评论 1 32
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,375评论 0 17
  • 冬季的傍晚,暮色苍凉,夕阳,把几只鸦雀匆匆赶回了归巢,夜,已经加快了脚步……而我,接上放学的儿子,刚刚驾车路...
    伊丽苏白阅读 149评论 0 1