接收浏览器上传文件的cgi程序
来源:互联网 发布:微信小程序 阿里云oss 编辑:程序博客网 时间:2024/05/11 09:43
/**************************************************************************
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;
}
- 接收浏览器上传文件的cgi程序
- 接收浏览器上传文件的cgi程序
- Linux CGI 上传程序
- cgi上传文件中文的问题
- CGI程序: 获得HTTP POST上传的文件,并保存在本地
- boa+cgi上传文件
- CGI上传文件
- CGI上传文件
- boa+cgi上传文件
- 浏览器兼容的文件上传
- Http文件上传服务器端接收的数据格式
- nanoHTTPD 接收 okhttp 上传的文件
- Java服务器接收上传的文件
- C语言CGI上传文件
- 用C/C++写上传文件的CGI,遇到问题
- boa cgi + web页实现文件的上传
- 上传文件的程序
- PHP接收上传文件
- 系统安全之堵住日常操作易泄密的漏洞
- J2SE发展演变史
- 利用 IIS日志追查网站入侵者
- [原创](Object/(DataSet,DataReader) Relational Mapping)ODRM
- Discuz论坛爆物理路径原理
- 接收浏览器上传文件的cgi程序
- WL 的SRS V0.9终于写完了。
- socket连接状态的判断
- 摈弃低效率的广告模式 做自主博客
- 银行卡密码校验技术
- 火车上的思考
- Notes of struts-config.xml
- 【转贴】C#箴言:定义常量的两种方法
- Ajax-服务器回应XML文档的中文乱码问题