接收浏览器上传文件的cgi程序

原创 2007年09月24日 16:37:00
**************************************************************************
2007-1-5 11:42 establish by lzh.A cgi program.
get a file from user's explorer.
***************************************************************************/
#include <stdio.h>
#include <string.h>

#define DEAL_BUF_LEN  1024
#define SIGN_CODE_LEN  100
#define FILE_NAME_LEN 64
#define FILE_SAVE_DIR "/var/log/"
enum
{
 STATE_START,
 STATE_GET_SIGN_CODE,
 STATE_GET_FILE_NAME,
 STATE_GET_FILE_START,
 STATE_GET_FILE_CONTENT,
 STATE_CHECK_END,
 STATE_END
};
/***************************************************************************
ShowErrorInfo
****************************************************************************/
static void ShowErrorInfo(char * error)
{

 printf("Content-type:text/plain/n/n");
 printf(error);
}

/* 主体从这里开始 */

int main(void)
{
 FILE *fp; /* 文件指针,保存我们要获得的文件 */
 int getState = STATE_START;
 int contentLength;/*标准输入内容长度*/
 int nowReadLen;
 int signCodeLen;
 int tmpLen;
 char *nowReadP;
 char *nowWriteP;
 char dealBuf[DEAL_BUF_LEN];
 char signCode[SIGN_CODE_LEN]; /*存储本次的特征码*/
 char tmpSignCode[SIGN_CODE_LEN];
 char fileName[FILE_NAME_LEN];
 memset(dealBuf,0,DEAL_BUF_LEN);
 memset(signCode,0,SIGN_CODE_LEN);
 memset(fileName,0,FILE_NAME_LEN);
 nowReadLen = 0;
 if((char *)getenv("CONTENT_LENGTH")!=NULL)
 {
  contentLength = atoi((char *)getenv("CONTENT_LENGTH"));
 }
 else
 {
  ShowErrorInfo("没有数据!");
  exit(1);
 }
 
 while(contentLength > 0)
 {
  if(contentLength >= DEAL_BUF_LEN)
  {
   nowReadLen = DEAL_BUF_LEN;
  }
  else
  {
   nowReadLen = contentLength;
  }
  contentLength -= nowReadLen;
  if(fread(dealBuf,sizeof(char),nowReadLen,stdin) != nowReadLen)
  {
   ShowErrorInfo("读取数据错误!");
   exit(1);
  }
  nowReadP = dealBuf;
  while(nowReadLen > 0)
  {
   switch (getState)
   {
    case STATE_START:
     nowWriteP = signCode;
     getState = STATE_GET_SIGN_CODE;
    case STATE_GET_SIGN_CODE:
     if(strncmp(nowReadP,"/r/n",2) == 0)
     {
      signCodeLen = nowWriteP - signCode;
      nowReadP++;
      nowReadLen--;
      *nowWriteP = 0;
      getState = STATE_GET_FILE_NAME;
      //ShowErrorInfo(signCode);
     }
     else
     {
      *nowWriteP = *nowReadP;
      nowWriteP++;
     }
     break;
    case STATE_GET_FILE_NAME:
     if(strncmp(nowReadP,"filename=",strlen("filename=")) == 0)
     {
      nowReadP += strlen("filename=");
      nowReadLen -= strlen("filename=");
      nowWriteP = fileName + strlen(FILE_SAVE_DIR);
      while(*nowReadP != '/r')
      {
       if(*nowReadP == '//')
       {
        nowWriteP = fileName + strlen(FILE_SAVE_DIR);
       }
       else if(*nowReadP != '/"')
       {
        *nowWriteP = *nowReadP;
        nowWriteP++;
       }
       nowReadP++;
       nowReadLen--;
      }
      *nowWriteP = 0;
      nowReadP++;
      nowReadLen--;
      getState = STATE_GET_FILE_START;
      memcpy(fileName,FILE_SAVE_DIR,strlen(FILE_SAVE_DIR));
      if((fp=fopen(fileName,"w"))==NULL)
      {
       fprintf(stderr,"open file error/n");
       exit(1);
      }
      //ShowErrorInfo(fileName);
     }
     break;
    case STATE_GET_FILE_START:
     if(strncmp(nowReadP,"/r/n/r/n",4) == 0)
     {
      nowReadP += 3;
      nowReadLen -= 3;
      getState = STATE_GET_FILE_CONTENT;
      //ShowErrorInfo("get");
     }
     break;
    case STATE_GET_FILE_CONTENT:
     if(*nowReadP != '/r')
     {
      fputc(*nowReadP,fp);
     }
     else
     {
      if(nowReadLen >= (signCodeLen + 2))
      {
       if(strncmp(nowReadP + 2,signCode,signCodeLen) == 0)
       {
        getState = STATE_END;
        nowReadLen = 1;
        ShowErrorInfo("传输完成");
       }
       else
       {
        fputc(*nowReadP,fp);
       }
      }
      else
      {
       getState = STATE_CHECK_END;
       nowWriteP = tmpSignCode;
       *nowWriteP = *nowReadP;
       nowWriteP++;
       tmpLen = 1;
      }
     }
     break;
    case STATE_CHECK_END:
     if(*nowReadP != '/r')
     {
      if(tmpLen < signCodeLen + 2)
      {
       *nowWriteP = *nowReadP;
       nowWriteP++;
       tmpLen++;
       if(tmpLen == signCodeLen + 2)
       {
        *nowWriteP = 0;
        if((tmpSignCode[1] == '/n')&&(strncmp(tmpSignCode + 2,signCode,signCodeLen) == 0))
        {
         getState = STATE_END;
         nowReadLen = 1;
         ShowErrorInfo("传输完成");
        }
        else
        {
         //fprintf(fp,tmpSignCode);
         fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
         getState = STATE_GET_FILE_CONTENT;
        }
       }
      }
     }
     else
     {
      *nowWriteP = 0;
      //fprintf(fp,tmpSignCode);
      fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
      nowWriteP = tmpSignCode;
      *nowWriteP = *nowReadP;
      nowWriteP++;
      tmpLen = 1;
     }
     break;
    case STATE_END:
     nowReadLen = 1;
     break;
    default:break;
   }
   nowReadLen--;
   nowReadP++;
  }
 }
 if(fp != NULL)
 {
  fclose(fp);
 }
 return 0;
}
 

c语言编写cgi程序,无法加载lib文件的问题

用c写的cgi程序,如果编译时不加载lib文件,一切正常,但是只要加载了lib文件,编译出来的可执行程序在服务器(UNIX)上运行结果一切正常,但是无法在网页中调用,会在网页中出现如下错误信息: ...

学习用c、c++写cgi程序

  • 2012年04月07日 15:52
  • 38KB
  • 下载

CGI程序中的环境变量详解.doc

  • 2012年06月23日 12:59
  • 61KB
  • 下载

[译]c++ web编程:写出你的CGI程序

一 什么是CGI       CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准。  二 web浏览器     ...

cgicc写cgi程序的库

  • 2010年06月03日 17:09
  • 7.77MB
  • 下载

使用dll创建cgi程序(181KB)

  • 2006年02月23日 09:05
  • 180KB
  • 下载

C++ web编程:写出你的CGI程序

一 什么是CGI       CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准。  二 web浏览器     ...
  • weiqubo
  • weiqubo
  • 2014年02月17日 11:05
  • 1281

机器人大战CGI程序

  • 2002年09月23日 00:00
  • 1.22MB
  • 下载

C语言写CGI程序【转】

一、CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接收浏览器上传文件的cgi程序
举报原因:
原因补充:

(最多只允许输入30个字)