前言:
这几天做了一个从服务器端下载文件的功能,就把自己代码以及和网上的代码进行总结了下。通过服务端进行下载,一般浏览器会自动默认下载的路径,一般的话都会保存到C盘的下载的文件夹里。想要下载到客户端固定的文件夹,这个功能我没考虑,以后有时间看看吧。
不多说了直接上代码:
/// <summary>
/// 第一种
/// </summary>
/// <returns></returns>
public FileStreamResult Down()
{
string fileName = "aaa.xlsx";//客户端保存的文件名
string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
return File(new FileStream(filePath, FileMode.Open), "text/plain",
fileName);
//其中:“text/plain”是文件MIME类型
}
/// <summary>
/// 第二种
/// </summary>
/// <returns></returns>
public FileResult Down1()
{
string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
return File(filePath, "text/plain", "welcome.xlsx"); //welcome.txt是客户端保存的名字
}
/// <summary>
/// 第三种
/// </summary>
public void Down2()
{
string fileName = "aaa.xlsx";//客户端保存的文件名
string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
FileInfo fileinfo = new FileInfo(filePath);
Response.Clear(); //清除缓冲区流中的所有内容输出
Response.ClearContent(); //清除缓冲区流中的所有内容输出
Response.ClearHeaders(); //清除缓冲区流中的所有头
Response.Buffer = true; //该值指示是否缓冲输出,并在完成处理整个响应之后将其发送
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
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();
}
/// <summary>
/// 第四种
/// </summary>
public void Down3()
{
string fileName = "aaa.xlsx";//客户端保存的文件名
string filePath = Server.MapPath("~/DownFile/test.xlsx");//路径
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();
}
}
//下载Zip文件
public void DownLoadZipFile()
{
string fileName = Request["fileName"];
string path = Server.MapPath("/ExportZip/" + fileName + ".zip");
//指定块大小
long chunkSize = 204800;
//建立一个200K的缓冲区
byte[] buffer = new byte[chunkSize];
//已读的字节数
long dataToRead = 0;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/octet-stream";
string encodeFileName = Path.GetFileName(path);
if (Request.UserAgent.ToLower().IndexOf("msie") > -1)
encodeFileName = HttpUtility.UrlPathEncode(encodeFileName);
if (Request.UserAgent.ToLower().IndexOf("firefox") > -1)
encodeFileName = "\"" + encodeFileName + "\"";
else
encodeFileName = HttpUtility.UrlEncode(encodeFileName, System.Text.Encoding.UTF8);
try
{
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
dataToRead = stream.Length;
Response.AddHeader("Content-Disposition", "attachement;filename=" + encodeFileName);
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.AddHeader("Content-Length", dataToRead.ToString());
while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new Byte[chunkSize];
dataToRead = dataToRead - length;
}
else
dataToRead = -1;
}
}
}
catch (Exception)
{
Response.Write("<script>alert('下载失败,请重试')</script>");
}
finally
{
//context.Response.Close();
}
}
结尾:
上面的代码都是经过我的实际测试的,完全可以实现功能,大家放心的使用,只需要根据你们的需求把文件名和文件路径改了就行