Chinaunix

标题: [cgi脚本]怎么样才能文本图片一起输出? [打印本页]

作者: fuer    时间: 2006-07-21 19:25
标题: [cgi脚本]怎么样才能文本图片一起输出?
#if 1
#define SERVER_NAME cgiServerName
#endif
#if 0
#define SERVER_NAME "www.boutell.com"
#endif


#ifdef WIN32
#define SAVED_ENVIRONMENT "c:\\cgicsave.env"
#else
#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
#endif /* WIN32 */

#include <stdio.h>
#include "cgic.h"
#include <string.h>
#include <stdlib.h>


void LoadEnvironment();


int cgiMain() {
#ifdef DEBUG
        LoadEnvironment();
#endif /* DEBUG */
        if (cgiFormSubmitClicked("loadenvironment") == cgiFormSuccess) {
                LoadEnvironment();
        }
        cgiHeaderContentType("text/html");
        /* Top of the page */
        fprintf(cgiOut, "<HTML><HEAD>\n");
        fprintf(cgiOut, "<TITLE>cgic test</TITLE></HEAD>\n");
        fprintf(cgiOut, "<BODY><H1>cgic test</H1>\n");
        if ((cgiFormSubmitClicked("testcgic") == cgiFormSuccess) ||
                cgiFormSubmitClicked("saveenvironment") == cgiFormSuccess)
        {
                    fprintf(cgiOut,"Content-type: image/gif\r\n");
            fprintf(cgiOut,"Content-disposition: inline; filename=apache.gif\r\n\r\n");
            fprintf(cgiOut,"name:apache.gif");
                fprintf(cgiOut, "<hr>\n");
        }
        /* Now show the form */
        /* Finish up the page */
        fprintf(cgiOut, "</BODY></HTML>\n");
        return 0;
}
  这是cgic205 cgitest.c中的部分代码,我改了改我只是想先显示一个<TITLE>cgic test</TITLE>再显示一行〈H1>cgic test</H1>
  完了是:
    fprintf(cgiOut,"Content-type: image/gif\r\n");
            fprintf(cgiOut,"Content-disposition: inline; filename=apache.gif\r\n\r\n");
            fprintf(cgiOut,"name:apache.gif");
                fprintf(cgiOut, "<hr>\n");
    编译通过了,结果运行就显示了<TITLE>cgic test</TITLE>别的什么也没有
   哪位老大告诉我怎样在cgi脚本中同时输出文本和图片呢?
    或着图片文本交替输出
  我始终没搞明白怎样用c语言使用cgic库写程序输出图片
我就是想在网页中通过cgi脚本输出文本和图片
还有就是mime头在一个网页输出中能使用两次吗比如:
Content-type: text/html\n\n
    html代码。。。
Content-type: image/gif\n\n
    html代码。。。。
能象这样使用吗?

[ 本帖最后由 fuer 于 2006-7-22 13:08 编辑 ]
作者: xabbca    时间: 2006-07-21 20:37
HTML
作者: xabbca    时间: 2006-07-21 20:38
Content-type: text/html\n\n
    html代码。。。
Content-type: image/gif\n\n
    html代码。。。。

同一个脚本不能有两个Content-type
作者: HonestQiao    时间: 2006-07-21 20:57
这是做不到的。

不过。png有一种编码方式可以放入网页的。
作者: fuer    时间: 2006-07-22 10:30
哪位老大告诉我怎样在cgi脚本中同时输出文本和图片呢?
    或着图片文本交替输出
  我始终没搞明白怎样用c语言使用cgic库写程序输出图片
我就是想在网页中通过cgi脚本输出文本和图片
作者: newzy    时间: 2006-07-22 11:57
是不是想把图片和文本数据全放到一个CGI 文件中?
样例 cgi 程序见附件.
windows 环境用 demo.rar
linux        环境用 demo.gz

如果是, 我告诉你答案.

demo.rar

90.38 KB, 下载次数: 76

demo.cgi.gz

23.9 KB, 下载次数: 97


作者: fuer    时间: 2006-07-22 11:58
标题: 回复 5楼 fuer 的帖子
难道图片存在*befull里还得创建一个文件fopen()把图片写到文件里fwite()再使用<img=src.....>显示在网页上吗?用c语言不能直接把*befull里的图片写到标准输出stout再网页上显示出来吗?
   
  一般的网页是:
  printf("Content-type: text/html\n\n")
   printf("<HTML><HEAD>\n");
    printf( "<TITLE>cgic test</TITLE></HEAD>\n");
     printf( "<BODY><H1>cgic test</H1>\n");
怎么样在这里直接输出图片而不是用printf("<img=src...>")这样的东西,
    int name[];  假设里面有图片
怎么样才能把name里的图片直接输出

    printf("</body></html>")
作者: fuer    时间: 2006-07-22 12:01
标题: 回复 6楼 newzy 的帖子
newzy老大你直接写一小段代码就行了
  最好是一小段完整的直接能编译通过的

[ 本帖最后由 fuer 于 2006-7-22 12:16 编辑 ]
作者: fuer    时间: 2006-07-22 12:08
标题: 回复 6楼 newzy 的帖子
对就是demo.cgi这样请newzy老大教教我怎么写
万分感谢
作者: newzy    时间: 2006-07-22 13:25
原理:
    WEB 是一个典型的分布式应用, 它被设计成一次请求一个应答.
    图文并存的 WEB 页面, 必须通过多次传送页面上的每个元素.
    Content-Type 用于标识每次应答的元素类型,
    如 text/html 标识 html 文本, image/jpeg 标识图片.


CSP 源程序:
说明: 直接将 C 代码嵌入到 html/xml 文本中, <% %> 之间的代码为 CSP 语句.


  1. <html>
  2. <head>
  3. <meta http-equiv=Content-Type content="text/html; charset=gb2312">
  4. <title>eybuild/CSP demo</title>
  5. </head>
  6. <body>
  7. <% {static int        num=0; %>
  8. <p>计数器: <% =$++num %></p>
  9. <% }%>
  10. Hello world. <img src="<% =romPrefix(NULL) %>/img/face.gif">
  11. <BR>
  12. <form action="<% =cgiPrefix(NULL) %>/demo/test.csp" method="post">
  13.     请在输入: <input type="text" name="inputbox"><br>
  14.     <input type="submit" name="testit" value="testit"><br>
  15. </form>
  16. </body>
  17. </html>
复制代码


使用安装:
下载地址: http://www.eybuild.com/develop/download/eybuild-00-08-04.tar.gz
Windows环境安装:

1.  将eyBuild开发包eybuild-xx-yy-zz.tar.gz解压到一个目录,如E:\eybuild
2.  设置环境变量EYBUILD_BASE=E:\eybuild,方法是:
A. 从菜单“开始à设置à控制面板à系统”打开系统属性对话框
B. 从“高级”选项卡上点击“环境变量”按钮
C. 可根据需要在“用户变量”或“系统变量”将EYBUILD_BASE正确添加进去

Linux环境安装:

1.  将eybuild开发包eybuild-xx-yy-zz.tar.gz解压到一个目录,如$HOME/eybuild

2.  打开.bash_profile添加如下语句,以设置环境变量:
EYBUILD_BASE=$HOME/eybuild
export EYBUILD_BASE

3.  退出并重新登录当前shell

Windows 下, 用 VC++ 打开 $(EYBUILD_BASE)/project/demo/win32/demo.dsw 编译生成 demo.cgi
Linux 下:
# cd eybuild/project/demo/unix
make clean all

详见 <<eybuild 中文手册>>
http://www.eybuild.com/develop/doc/manual/eybuild_manual_ch.htm

祝你好运!

[ 本帖最后由 newzy 于 2006-7-22 13:29 编辑 ]
作者: fuer    时间: 2006-07-22 13:35
标题: 回复 10楼 newzy 的帖子
Hello world. <img src="<% =romPrefix(NULL) %>/img/face.gif">这句不能改用Printf()或者别的函数输出吗?我说的就是用c标准函数直接输出,有办法吗?
  难道图片存在*befull里还得创建一个文件fopen()把图片写到文件里fwite()再使用<img=src.....>显示在网页上吗?用c语言不能直接把*befull里的图片写到标准输出stout再网页上显示出来吗?
   
  一般的网页是:
  printf("Content-type: text/html\n\n")
   printf("<HTML><HEAD>\n");
    printf( "<TITLE>cgic test</TITLE></HEAD>\n");
     printf( "<BODY><H1>cgic test</H1>\n");
怎么样在这里直接输出图片而不是用printf("<img=src...>")这样的东西,
    int name[];  假设里面有图片
怎么样才能把name里的图片直接输出

    printf("</body></html>")

[ 本帖最后由 fuer 于 2006-7-22 13:49 编辑 ]
作者: newzy    时间: 2006-07-22 15:50
Hello world. <img src="<% =romPrefix(NULL) %>/img/face.gif">这句不能改用Printf()或者别的函数输出吗?我说的就是用c标准函数直接输出,有办法吗?


不能, 文本和数据必须分开输出. 即通过两次 HTTP 会话.
第一次传文本, 第二次传图片.

上例的中间程序(ANSI C):


  1. /* NOTE: DO NOT EDIT THIS FILE,
  2. * this file is create by tool (csp2bin version: 00.09.00) automaticly,
  3. * build at: Fri Jul 21 20:40:15 2006
  4. */
  5. /* NOTE: YOU SHOULDN'T ADD THIS FILE TO YOUR PROJECT DIRECTLY,
  6. * When you add `../xx_maplist.c' to your project,
  7. * this file will be added into your project.
  8. *
  9. */

  10. #include <string.h>
  11. #include <eblib.h>
  12.                            

  13. static int _demo_main_csp___mime_header();

  14. int _demo_main_csp__ (int __calldepth, void * __handle, void * __ebfp)
  15. {
  16.     int __ret = OK;
  17.     char * __page_name = "main.csp";
  18.     char * __page_path = "/demo/";
  19.     char * __page_fullname = "/demo/main.csp";

  20.     if (__calldepth==MAX_CALL_DEPTH)
  21.         __ret=_demo_main_csp___mime_header(__ebfp);
  22.     goto_ERROR;

  23.     __ret=(int)ebBufStringAdd(__ebfp,
  24.         "<html>\n"
  25.         "<head>\n"
  26.         "<meta http-equiv=Content-Type content=\"text/html; charset=gb2312\">\n"
  27.         "<title>eybuild/CSP demo</title>\n"
  28.         "</head>\n"
  29.         "<body>\n"
  30.         );
  31.     goto_ERROR;

  32.     {static int num=0;
  33.     __ret=(int)ebBufStringAdd(__ebfp,
  34.         "<p>计数器: "
  35.         );
  36.     goto_ERROR;

  37.     __ret = (int)ebprintf(__ebfp, "%d", ++num);
  38.     goto_ERROR;

  39.     __ret=(int)ebBufStringAdd(__ebfp,
  40.         "</p>\n"
  41.         );
  42.     goto_ERROR;

  43.     }
  44.     __ret=(int)ebBufStringAdd(__ebfp,
  45.         "Hello world. <img src=\""
  46.         );
  47.     goto_ERROR;

  48.     __ret = (int)ebprintf(__ebfp, "%s", romPrefix2(NULL, "/img/face.gif"));
  49.     goto_ERROR;

  50.     __ret=(int)ebBufStringAdd(__ebfp,
  51.         "\">\n"
  52.         "<BR>\n"
  53.         "<form action=\""
  54.         );
  55.     goto_ERROR;

  56.     __ret = (int)ebprintf(__ebfp, "%s", cgiPrefix2(NULL, "/demo/test.csp"));
  57.     goto_ERROR;

  58.     __ret=(int)ebBufStringAdd(__ebfp,
  59.         "\" method=\"post\">\n"
  60.         "    请在输入: <input type=\"text\" name=\"inputbox\"><br>\n"
  61.         "    <input type=\"submit\" name=\"testit\" value=\"testit\"><br>\n"
  62.         "</form>\n"
  63.         "</body>\n"
  64.         "</html>\n"
  65.         );
  66.     goto_ERROR;

  67.     if ((__calldepth==MAX_CALL_DEPTH) && ERROR == ebBufFlush(__ebfp))
  68.         return ERROR;

  69.     return __ret;

  70.     EB_REMOVE_NOUSED_WARNING();
  71. } /* _demo_main_csp__ */

  72. static int _demo_main_csp___mime_header(void * __ebfp)
  73. {
  74.     return ebprintf(__ebfp, "Content-Type: text/html\n\n");
  75. }

复制代码

作者: fuer    时间: 2006-07-22 19:23
标题: 回复 12楼 newzy 的帖子
感谢newzy老大,也就是说图片只能作为文件输出或者说只能输出图片文件




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2