直接把字符串输出到客户端供下载
我要实现的功能是从数据库中读取需要的数据出来,然后呢,生成一个文件给用户下载。就是,因为不想在服务器端留下文件,所以我把读出来的数据用StringBuilder组成字符串后,直接发送到客户端给用户下载了。
private void DownLoadText(string text)
{
bool ok = true;
string fileName;
fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".gbpt";
try
{
Response.ClearHeaders();
Response.ContentType = "application/zip;";
Response.Charset = "UTF-8";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", fileName));
Response.BinaryWrite(Encoding.Default.GetBytes(text));
}
catch (Exception ex)
{
ok = false;
Response.Write("生成文件失败:" + ex.Message + ",请稍后再试。");
CreateGbpt(fileName, text);
}
if (ok)
{
Response.End();
}
}
下面是一开始时先生成文件再下载的办法:
#region 把字符串写成文件
private void CreateGbpt(string fileName, string text)
{
bool ok = true;
string filePath;
filePath = Server.MapPath(fileName);
Encoding code = Encoding.GetEncoding("utf-8"); //定义编码
try
{
using (StreamWriter sw = new StreamWriter(filePath, false, code))
{
sw.Write(text.Trim());
sw.Flush();
}
}
catch (DirectoryNotFoundException ex)
{
ok = false;
Response.Write("写入文件出错:" + ex.Message);
}
//文件写入成功,下载文件
if (ok)
{
DownLoadFile(fileName);
}
}
#endregion
#region 下载文件
private void DownLoadFile(string fileName)
{
bool ok = true;
if (System.IO.File.Exists(Server.MapPath(fileName)))
{
try
{
Response.ClearHeaders();
Response.ContentType = "application/zip;";
Response.Charset = "UTF-8";
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", fileName));
Response.BinaryWrite(GetFileBytes(fileName));
}
catch (Exception ex)
{
ok = false;
Response.Write("文件不能提供下载,请手动点击下载。" + ex.Message);
}
if (ok)
{
File.Delete(Server.MapPath(fileName));
Response.End();
}
else
{
HypFile.NavigateUrl = fileName;
HypFile.Text = "生成文件:" + fileName + ",请点击下载";
}
}
}
private byte[] GetFileBytes(string fileName)
{
try
{
using (System.IO.FileStream fileStream = new System.IO.FileStream(System.Web.HttpContext.Current.Server.MapPath(fileName), System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, (int)fileStream.Length);
return bytes;
}
}
catch
{
return null;
}
}
#endregion