已被阅读 984 次 | 文章分类:csharp | 2021-11-25 00:31
本文整理了.net mvc项目中五种文件下载的方式
1 a标签链接
a标签链接直接指向文件地址,但前提是文件地址是你自己服务器下载地址,如果直接链接到其他站点,比如流行软件下载地址,该行为便属于盗链嫌疑了
2 直接返回文件
直接通过文件地址返回
// 返回file
public FileResult DownloadFile()
{
// 路径
string filePath = Server.MapPath("~/Content/data/2.exe");
// 2.exe是客户端保存的名字
return File(filePath, "text/plain", "2.exe");
}
3 文件流方式
将文件转为文件流,再通过File返回
// 返回filestream
public FileStreamResult DownloadFilestream()
{
// 路径
string filePath = Server.MapPath("~/Content/data/1.zip");
// 1.zip 是客户端保存的名字
return File(new FileStream(filePath, FileMode.Open), "text/plain", "1.zip");
}
4 TransmitFile方式
//
// 摘要:
// 将指定文件写入 HTTP 响应输出流(不在内存中进行缓冲)。
//
// 参数:
// filename:
// 要写入 HTTP 输出流的文件名。
//
// 异常:
// T:System.NotImplementedException:
// 始终。
public virtual void TransmitFile(string filename);// TransmitFile方法
代码如下:
// TransmitFile方法
public void TransmitFile()
{
string filePath = Server.MapPath("~/Content/data/2.exe");//路径
FileInfo fileinfo = new FileInfo(filePath);
Response.Clear(); // 清除缓冲区流中的所有内容输出
Response.ClearContent(); // 清除缓冲区流中的所有内容输出
Response.ClearHeaders(); // 清除缓冲区流中的所有头
Response.Buffer = true; // 该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
Response.AddHeader("Content-Disposition", "attachment;filename=" + "2.exe");
Response.AddHeader("Content-Length",fileinfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/unknow"; // 获取或设置输出流的 HTTP MIME 类型
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); // 获取或设置输出流的 HTTP 字符集
Response.TransmitFile(filePath);
Response.End();
}
5 分块下载
// Response分块下载
public void ResponseFk()
{
string fileName = "2.exe";// 客户端保存的文件名
string filePath = Server.MapPath("~/Content/data/2.exe");// 路径
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400; // 100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;// 获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));// 读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
}
}
QQ:3410192267 | 技术支持 微信:popstarqqsmall
Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号