经常用到导出文件的功能,在导出文件后,首先文件是暂时保存在服务器上的一个临时目录中,然后调用下面的方法将文件输出到客户端供用户下载。下载完成后,并删除服务器上的临时文件。
代码
/// <summary>
/// 从服务器下载文件到客户端
/// </summary>
/// <param name="filepath">要下载文件的绝对物理路径</param>
public static void OutputFileToClient(string filepath)
{
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];
// Length of the file:
int length;
// Total bytes to read:
long dataToRead;
//得到文件名
string filename = System.IO.Path.GetFileName(filepath);
//当前 http 上下文
HttpContext context = HttpContext.Current;
try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read:
dataToRead = iStream.Length;
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (context.Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);
// Write the data to the current output stream.
context.Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
context.Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
//删除服务器上的文件
System.IO.File.Delete(filepath);
}
//结束输出流
context.Response.Close();
}
}
/// 从服务器下载文件到客户端
/// </summary>
/// <param name="filepath">要下载文件的绝对物理路径</param>
public static void OutputFileToClient(string filepath)
{
System.IO.Stream iStream = null;
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];
// Length of the file:
int length;
// Total bytes to read:
long dataToRead;
//得到文件名
string filename = System.IO.Path.GetFileName(filepath);
//当前 http 上下文
HttpContext context = HttpContext.Current;
try
{
// Open the file.
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// Total bytes to read:
dataToRead = iStream.Length;
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
// Read the bytes.
while (dataToRead > 0)
{
// Verify that the client is connected.
if (context.Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10000);
// Write the data to the current output stream.
context.Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
context.Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (iStream != null)
{
//Close the file.
iStream.Close();
//删除服务器上的文件
System.IO.File.Delete(filepath);
}
//结束输出流
context.Response.Close();
}
}