[TOC]javascript
上传文件我使用的是Bootstrap的插件FileInput,这个抽时间看看写个博客html
如今下载我遇到坑了,而这个坑,我之前踩过.....java
网上一搜,大把,下面的代码也是我复制网上的,怎么都不行ajax
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();
而后我新建了个项目,把上面的代码复制进去,行了.....json
我对比了一下个人项目,我竟然又犯了之前踩过的一个坑,我不知道ajax不能请求下载方法!!!app
ajax的返回值类型是json,text,html,xml类型,因此ajax请求的方法返回的基本上都是json格式,然而我访问的是下载方法,返回的是文件流......学习
改版思路,使用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类,以下spa
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);