通过返回数据流的方式实现相片的显示和下载

问题:由于相片数据是通过Base64加密之后存储在oracle数据库中的,所以通过接口返回的只是数据流格式的图片信息,而没有固定的图片路径。

        没有固定的图片路径,出现的问题是:

        1.在浏览器显示的图片没有办法实现右键图片另存为;

        2.下载图片的时候没有办法只是提供一个固定的url路径

需求:通过数据流的方式返回的图片,使其在前端中显示,并且能够有一个按钮实现图片的下载。

前端代码:

<div class="pic">
<img src="PicHandler.ashx?id=<%=PictureID %>" alt="" />
<br />
<a class="btn btn-info" href="DownPic.ashx?id=<%=PictureID %>">下载相片</a>
</div>

 

后台处理代码在这里只记录数据流返回的一段:

在图片显示PicHandler.ashx中:

//imgUrl是字符串格式的url
Uri myUri = new Uri(imgUrl);
WebRequest webRequest = WebRequest.Create(myUri);
WebResponse webResponse = webRequest.GetResponse();
Bitmap myImage = new Bitmap(webResponse.GetResponseStream());
MemoryStream ms = new MemoryStream();//创建一个内存流
myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片信息保存到内存流中
context.Response.ClearContent();
context.Response.ContentType = "application/octet-stream";//"image/Jpeg";
context.Response.BinaryWrite(ms.ToArray());//响应给浏览器的是byte[]流

点击按钮下载图片时,实现的代码是:

string fileName = "photo.jpg";//客户端保存的文件名
Uri myUri = new Uri(imgUrl); //通过url字符串获取到uri

WebRequest webRequest = WebRequest.Create(myUri); WebResponse webResponse = webRequest.GetResponse(); Bitmap myImage = new Bitmap(webResponse.GetResponseStream()); //将请求返回的数据流存储为一张相片 myImage.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); //通知浏览器下载文件而不是打开 context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8)); context.Response.ContentType = "image/jpeg"; context.Response.Flush(); context.Response.End();

主要注意点是两个:图片的下载,没有提供固定的图片路径;

1、将图片保存到context.Response.OutputStream中;

2、//通知浏览器下载文件而不是打开

     context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8));

通过这样的方法,可以实现图片的下载 ,但是右键图片另存为这个功能还是使用不了的。

 

posted @ 2015-03-17 17:51  yaoxinrisk  阅读(2127)  评论(0编辑  收藏  举报