关于数据库保存的二进制图片无法在colorbox插件中显示的解决办法

colorbox是非常优秀的图片显示插件,但最近想用它来显示保存在数据库中的二进制图片却发现问题,就是无法正确显示,显示出来的都是一些乱码字符,究竟问题出在那呢?

于是循例百度了一下,是有人也碰到这个问题,但没有提出解决方案呀!看来只能自己分析原因了。。。

首先说下我的开发环境:ASP.NET MVC+COLORBOX,那问题不是出在MVC就是COLORBOX上了。

1、MVC分析:

无论图片保存数据库还是保存在目录文件,都是无非转换为二进制流返回比浏览器,于是我试下用COLORBOX显示保存在某个目录下的图片,输入测试网址:http://localhost:6234//Images/010806cjierech73n727j2.jpg,结果是完全问题呀!于是再通过浏览器输入网址:http://localhost:6234/Mminfor/GetThereImageToView/34251,显示保存在数据库中的图片,也完全没问题呀!

因此,问题出在MVC上的可能性不大。

2、COLORBOX分析:

为什么直接在浏览器上显示没问题,而在jqurey上的插件COLORBOX显示就出问题呢?

首先从HTTP的响应头入手分析吧。

直接显示保存在目录文件下的HTTP响应头如下:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Sun, 14 Sep 2014 07:44:00 GMT
X-AspNet-Version: 4.0.30319
Cache-Control: public
ETag: "1CFCFEF4F346180"
Content-Type: image/jpeg
Content-Length: 155988
Connection: Close

而显示保存在数据库中的二进制图片的HTTP响应头如下:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Sun, 14 Sep 2014 07:46:03 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 4.0
Content-Type: image/jpeg
Content-Length: 155988
Connection: Close

从对比来看,二者的区别是一个响应头标识:ETag。于是用Response.AppendHeader方法把这个头标识加上再测试,但还是不行呀(后来百度了一下,“ETag”这个标识头是用于缓存的)。

既然响应头没发现到问题,于是再从发送头分析吧!

直接显示保存在目录文件下的HTTP发送头如下:

GET http://localhost:6234/Images/010806cjierech73n727j2.jpg HTTP/1.1
Host: localhost:6234
Connection: keep-alive
Accept: image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
Referer: http://localhost:6234/Mminfor/EditForumData
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4

而显示保存在数据库中的二进制图片的HTTP响应头如下:

GET http://localhost:6234/Mminfor/GetThereImageToView/34617 HTTP/1.1
Host: localhost:6234
Connection: keep-alive
Accept: text/html, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
Referer: http://localhost:6234/Mminfor/EditForumData
Accept-Encoding: gzip,deflate,sdch

我靠!终于发现问题了:

二者的区别原来在这个发送头标识:Accept,既然找到问题所在,剩下的问题就是如何把发送头标识Accept变为:Accept: image/webp,*/*;q=0.8的问题了。

下面是我解决该问题的一个方法(也许不是好方法,但大家可以参考一下):

把显示图片的原来网址:http://localhost:6234/Mminfor/GetThereImageToView/34617改为:

http://localhost:6234/Mminfor/GetThereImageToView/34617.jpg(当然你要显示的图片格式是gif、png、bmp也可改为对应的),至于服务器端如何提取参数值“34617”我就不再累述了(无法是字符串截取、类型转换嘛)。

为什么在网址后面加个“.jpg”扩展名就能把“Accept”标识头变为:Accept: image/webp,*/*;q=0.8了呢?我认为是浏览器的智能判断该网址的目的就是获取图片的吧,于是就把“Accept”标识头变为:Accept: image/webp,*/*;q=0.8了,这样图片二进制数据返回后COLORBOX就知道按图片而非字符来显示了。

从另一角度来看,这也算是COLORBOX要改进的一个地方吧,因为它没有浏览器那么智能,能通过返回的二进制流(文件头)来判断究竟该显示图片还是字符。

时间: 2024-10-07 06:09:07

关于数据库保存的二进制图片无法在colorbox插件中显示的解决办法的相关文章

EXCEL保存提示“隐私问题警告:此文档中包含宏……”解决办法

先点击"禁止宏运行"的那个按钮.打开文件后,按alt + F11 进入宏编辑器,在"工程"里查看是什么宏.如果是你需要的,就留着.否则右击这个宏名称,选择"移除". 另外,如果是你需要的,还需要在 工具→宏→安全性 里设成"低".这样就不会每次都提示了.(不过可能会有安全隐患) ------------------------------------------------------------- 方法一:点击Excel 上

关于网页中图片为中文名无法显示的解决办法

转载:http://lofei117.iteye.com/blog/1074182 网页中很多时候要用到图片,通过img标签或者滤镜来显示在页面上.而当文件名为中文名时会遇到图片无法正确加载,导致无法显示. 解决办法如下: 1:改变服务器的配置,使服务器支持utf-8来显示图片.这个经过测试是有效的,但是有一点是服务器配置修改了以后,再使用request来获取参数时,中文乱码的问题.通过System.out.print来打印出来的参数是正确的,但是赋值给String对象后却不是正确的值,再通过S

ecshop验证码图片无法显示终极解决办法

ecshop验证码图片无法显示终极解决办法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2014-06-06 客户在安装好ecshop之后所有前台的证码不显示,后台可以显示,ECSHOP开发中心总结了解决办法分享给各位朋友. 可以在后台有,前台不显示 打开includes/init.php文件,将如下这段代码屏蔽即可. /* 判断是否支持 Gzip 模式 */if (!defined(‘INIT_NO_SMARTY’) && gzip_enabled())

[经使用有效]Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附加数据库文件时弹出错误信息:如下图: ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊! 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录数据库造成的,只要将登录方式改为“windows身

SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一:切换登录方式 出现这种情况是由于用"混合验证方式"(SQL Server身份验证)登录数据库造成的,只要将登录方式改为"windows身份验证方式"登录即可解决该问题,附加成功后再换用"混合验证模式"登陆就没问题了. 方案二:修改服务 选择 所有程序

MySql重装以后,修改数据库路径,打开以前的数据库报Table 'XX库.XX表' doesn't exist错误的解决办法

因为mysql主流的数据库引擎有MyISAM和InnoDB两种, 如果是MyISAM,直接把以前数据库拷贝到修改后的路径是可以的 但是InnoDB因为存储结构不同,必须还得把备份的innodb数据库表“*.frm”文件和innodb数据“ibdata1”文件拷到修改后的合适路径 参考资料:http://www.bcty365.com/content-35-2928-1.html https://blog.csdn.net/dihuangtian01/article/details/5177353

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数

div背景图片或颜色不显示的解决办法

背景图片不显示的原因: 1. css没有被调用 2. css图片地址不对 3. div的高度没有固定,是auto.没有设值或者高度不够 4. div被嵌套 5. div代码不规范 解决办法: (1)DIV高度为自动,背景颜色无法显示,在代码中将原代码height:auto; 改为height:100%; overflow:hidden;!important:同时还可以兼容 IE6.7.8和谷歌火狐. (2)假设对一个对象设置了background背景颜色样式,该对象内部盒子有使用float浮动属

PHP 生成验证码(+图片没有显示的解决办法)

今天有需要用到验证码,就敲了个,毕竟用途比较广,所以打算把代码留下来,以后肯定用得上的.当然,今天在做的时候也是有一些问题的,分享出来吧,记录自己所犯的错误,避免以后再掉坑里. 先给个效果图(下面的真的是图): 再上完整的代码吧: 1 <?php 2 // 开启 session 3 session_start(); 4 5 // 丢弃输出缓冲区的内容 ** 6 ob_clean(); 7 8 // 1 创建画布 9 $img = imagecreatetruecolor(100, 30); 10