您的位置:首页 > 编程语言 > ASP

asp.net 直接 从数据库 下载 文件

2010-03-08 19:07 399 查看
当我们想要从网上下载文件时,通常的做法是在服务器上的某个目录下生成一个文件。
protected void DownloadFile(string filename)
{
string saveFileName = "test.xls";
int intStart = filename.LastIndexOf("//") + 1;
saveFileName = filename.Substring(intStart, filename.Length - intStart);
Response.Clear();
Response.Charset = "utf-8";
Response.Buffer = true;
this.EnableViewState = false;
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + saveFileName);
Response.WriteFile(filename);
Response.Flush();
Response.Close();
Response.End();
}


但会存在这样的情况,直接从数据库中下载图片。

其实原理很简单。就是用MemoryStream代替FileStream。有一点需要注意就是http头的格式要设置正确。
byte[] pic = //从数据库返回的图片
MemoryStream ms = new MemoryStream(pic);
System.Drawing.Image img = null;
Graphics g =null;
try
{
img = new Bitmap(new MemoryStream(pic));
g= Graphics.FromImage(img);
Font objfont = new Font("Verdana", 12, FontStyle.Bold);
Brush objbrush = Brushes.Red;
Rectangle rect = new Rectangle(150, 550, 200, 50);
g.DrawString("添加文字", objfont, objbrush, rect);
img.Save(ms, ImageFormat.Bmp);
}
catch { }
finally
{
if (img != null) img.Dispose();
if (g!= null) g.Dispose();
}
byte[] newbmp = ms.ToArray();
ms.Close();
ms = new MemoryStream(newbmp);
Response.Clear();
Response.AddHeader("Content-type", "binary/octet-stream");
Response.AddHeader("Content-Length", pic.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename="+pic.Length.ToString()+".bmp; size=" + pic.Length.ToString());
Response.Flush();
int chunksize=1024;
int lenght = ms.ToArray().Length;
for(int i=0;i<lenght;i+=chunksize)
{
if(Response.IsClientConnected==false)break;
int size=chunksize;
if(i+size>=pic.Length)
size=pic.Length-i;
byte[] chunk=new byte[size];
ms.Read(chunk,0,size);
Response.BinaryWrite(chunk);
Response.Flush();
}
ms.Close();
}


还有一点要注意的是:对图片操作以后要把ms转移出来然后再new一下。如下所示。
byte[] newbmp = ms.ToArray();
ms.Close();
ms = new MemoryStream(newbmp);


否则的话图片会不显示的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: