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

问题:由于相片数据是通过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));

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

时间: 2024-11-03 18:21:04

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

[转]WinExec、ShellExecute和CreateProcess及返回值判断方式

[转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/2392472.html 有三个API函数可以运行可执行文件WinExec.ShellExecute和CreateProcess.CreateProcess因为使用复杂,比较少用. WinExec主要运行EXE文件. ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT u

Ext_两种处理服务器端返回值的方式

1.Form表单提交返回值处理 //提交基本信息表单  f.form.submit({      clientValidation:true,      //表单提交后台处理地址      url:'/globe_background/Commonality/AccountClub.ashx?action=updateuserinfoform&uid=' + jsonDate.uid,      //数据提交方式      method:'POST',                      

【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-4]返回Json数据-方式2:http://www.cnblogs.com/ssslinppp/p/4530002.html [Spring学习笔记-MVC-3.1]SpringMVC返回Json数据-

返回人民币大写方式(num2rmb)

CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS -- PURPOSE :返回人民币大写方式 v_NUM NUMBER; I NUMBER; J NUMBER; K NUMBER; L NUMBER; FS1 NVARCHAR2(500); FS2 NVARCHAR2(500); FS3 NVARCHAR2(500); S NVARCHAR2(500); S1 NVARCHAR2(500); S2

【Spring学习笔记-MVC-4】返回Json数据-方式2

摘要 本文讲解另外一种利用spring MVC返回json数据的方法. 前文回顾 在<[Spring学习笔记-MVC-3]返回Json数据-方式1>中介绍了通过: @ResponseBody声明返回值: 配置<mvc:annotation-driven />: 来返回json数据.效果如下:   ==>, 从上面的效果看,只能返回一个对象,不能返回多个对象,不能做到形如下图的返回结果, 存在局限性(可能可以返回多个,自己不知道如何实现). 下面介绍的方式2,利用spring

Java多线程和并发(四),线程返回值获取方式和Callable接口

目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Callable接口 1.主线程等待法 public class CycleWait implements Runnable{ private String value; @Override public void run() { try { Thread.currentThread().sleep(50

WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码和配置:通过ChannelFactory<TChannel>创建服务代理对象.在这篇文章中,我们采用一种独特的方式进行服务的调用.从本质上讲,我们只要能够创建于服务端相匹配的终结点,就能够实现正常的服务调用.在WCF客户端元数据架构体系中,利用MetadataExchangeClient可以获取服

RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期

RHEL7.CentOS7提供三种命令行方式方式来设置和显示日期.时间.timedatectl是在RHEL7及CentOS7中新增的systemd的一部分,date是传统的日期时间设置命令,hwclock单元访问的是硬件时钟. 一.timedatectl [root@Geeklp-Administrator ~]# timedatectl Local time: 六 2017-12-16 19:49:53 CST Universal time: 六 2017-12-16 11:49:53 UTC

mybatis返回map类型数据空值字段不显示的解决方法

在日常开发中,查询数据返回类型为map,数据库中有些自动值为null,则返回的结果中没有值为空的字段,则如何显示值为空的字段呢? Spring boot + MyBatis返回map中null值默认不显示,如要调整为null值显示需要在配置文件中添加属性,如下图红框中所示: 2.Mybatis使用IFNULL(P1,P2)函数 原文地址:https://www.cnblogs.com/panchanggui/p/10919421.html