免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2945 | 回复: 19
打印 上一主题 下一主题

[讨论]这种方法能实现吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-17 09:37 |只看该作者 |倒序浏览
有没有方法使用cgi脚本把数据库输出的二进制数据直接输出到网页上,我知道浏览器在看到<img src=〉时会等待接受图片数据,那么能不能实现,当浏览器在看到<img src=...>时向服务器请求图片文件时在服务器端把数据库输出的二进制图片数据直接输出出去!
  
  难道在浏览器中显示图片和文字就只能先把数据库中的图片现在本地生成文件然后再用<img src=...>输出吗?
我说的是用c写cgi脚本

论坛徽章:
0
2 [报告]
发表于 2006-08-17 09:51 |只看该作者
当然可以实现了。
输出一个header指明是image/gif(或者png, jpeg),然后输出image文件的具体内容。

这是做计数器CGI的最基本要求。

论坛徽章:
0
3 [报告]
发表于 2006-08-17 09:59 |只看该作者
这样可以文字和图片一同输出到一个网页吗?

  那具体怎么做能给段代码讲一下吗?
谢谢

论坛徽章:
0
4 [报告]
发表于 2006-08-17 10:06 |只看该作者
原帖由 fuer 于 2006-8-17 09:59 发表
这样可以文字和图片一同输出到一个网页吗?

  那具体怎么做能给段代码讲一下吗?
谢谢

不明白你说的是什么意思,什么叫文字和图片一同输出?

给你看一段代码,是我以前写的骗小孩的小东西:

  1. #include "../cgi.h"
  2. #include <iconv.h>
  3. #include <gd.h>

  4. int main(int argc,char**argv)
  5. {
  6.     sqlite3 *db;
  7.     cout<<"Content-type:image/png\n\n";
  8.     cgiinit();

  9.     sqlite3_open(sqlitedatabase,&db);
  10.     char t[11];
  11.     sprintf(t,"%d",time(0));
  12.     string ip,insert;
  13.     ip=ip+"欢迎来到这里,"+ENV["REMOTE_ADDR"]+"!";
  14.     insert=insert+"insert into iplog values('"+ENV["REMOTE_ADDR"]+"',"+t+", '"+ENV["REMOTE_HOST"]+"', '"+ENV["HTTP_USER_AGENT"]+"', '"+ENV["HTTP_REFERER"]+"');";
  15.     sqlite3_exec(db,insert.c_str(),callback,0,0);

  16.     char s[100],*ps;
  17.     memset(s,0,100);
  18.     int brect[8],x,y;
  19.     ps=s;
  20.     size_t len=ip.length(),len2=100;
  21.     iconv_t ic=iconv_open("UTF-8","EUC-CN");
  22.     iconv(ic,(const char**)&ip,&len,&ps,&len2);
  23.     iconv_close(ic);
  24.     char *f="/usr/X11R6/lib/X11/fonts/TrueType/gbsn00lp.ttf";
  25.     gdImagePtr im;
  26.     int black,white;
  27.     gdImageStringFT(NULL,&brect[0],white,f,14.0,0.0,0,20,s);
  28.     x = brect[2]-brect[6] + 6; y = brect[3]-brect[7] + 6;
  29.     im = gdImageCreate(x,y);

  30.     black = gdImageColorAllocate(im, 0, 0, 0);
  31.     white = gdImageColorAllocate(im, 255, 255, 255);
  32.     x = 3 - brect[6]; y = 3 - brect[7];
  33.     gdImageStringFT(im,NULL,white,f,14.0,0.0,x,brect[1]-3,s);
  34.     gdImagePng(im, stdout);
  35.     gdImageDestroy(im);
  36.     sqlite3_close(db);
  37.     return 0;
  38. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2006-08-17 10:49 |只看该作者
你的水平好高深,我是个初学者,我的水平看不懂你的代码,但还是要谢谢

论坛徽章:
0
6 [报告]
发表于 2006-08-17 10:54 |只看该作者
原帖由 fuer 于 2006-8-17 10:49 发表
你的水平好高深,我是个初学者,我的水平看不懂你的代码,但还是要谢谢

不是我的水平高,而是因为我懒,没写注释,所以难看懂。

如果想用c写CGI动态生成图片,最好用libgd,
http://www.boutell.com/gd/
有例子可以看。

论坛徽章:
0
7 [报告]
发表于 2006-08-17 11:03 |只看该作者
用gd动态生成图片以后,然在存储到本地系统创建文件,然后在用<img src=>显示吗?
有没有办法,不在本地系统创建文件,<img src=在这里把缓冲区的图片数据直接输出给它>

论坛徽章:
0
8 [报告]
发表于 2006-08-17 11:25 |只看该作者
原帖由 fuer 于 2006-8-17 11:03 发表
用gd动态生成图片以后,然在存储到本地系统创建文件,然后在用<img src=>显示吗?
有没有办法,不在本地系统创建文件,<img src=在这里把缓冲区的图片数据直接输出给它>

我 给你看的程序就是这样做的。

论坛徽章:
0
9 [报告]
发表于 2006-08-17 11:30 |只看该作者
我好想弄懂,可惜是c++代码,我刚学会了c语言,我看不懂啊!好郁闷

论坛徽章:
0
10 [报告]
发表于 2006-08-17 11:35 |只看该作者
原帖由 fuer 于 2006-8-17 11:30 发表
我好想弄懂,可惜是c++代码,我刚学会了c语言,我看不懂啊!好郁闷

基本上是C代码,只不过用了cpp的cout。
我把程序精简一下,你既然会用gd,我就不详细列举GD的函数了:


  1. #include <iconv.h>
  2. #include <gd.h>

  3. int main(int argc,char**argv)
  4. {
  5.     printf("Content-type:image/png\r\n\r\n");

  6.     someting_to_do_with_im;

  7.     gdImagePng(im, stdout);//就这句实现了直接向浏览器传送图片数据
  8.     gdImageDestroy(im);
  9.     return 0;
  10. }
复制代码

假设这个程序生成a.cgi,
你调用<img src='path/a.cgi'>就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP