现在的位置: 首页 > 综合 > 正文

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

2013年10月04日 ⁄ 综合 ⁄ 共 4499字 ⁄ 字号 评论关闭
**************************************************************************
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;
}
 

抱歉!评论已关闭.