⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ps_usp_upload.cpp

📁 这个程序是实现了CGI上传功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	memset(filedata->name,0,base64codelen+1);
	memset(filedata->sfid,0,20);
	
	//printf("%x\t%x\t%x\n",filedata , filedata->name,filedata->sfid);
	strncpy(filedata->name , base64code,base64codelen);	
	
	strncpy(filedata->sfid , "123",20);
	filedata->size = filesize;
	rspfile.setFileData(filedata);	
	log.debugLog("=========================genrateRspFile.start=======================\r\n");
	rspfile.genrateRspFile();//注意需要去清理blockData,否则溢出
	delete []base64code;//释放base64code
	delete []hashString;
	delete []ipString;
}

/* 主体从这里开始 */
int main(void)
{	
	printf("Content-type:text/plain\n\n");	
	//printf(" apache .........1");
	log.openLog();
	//printf(" apache .........2");
	log.debugLog("=========================start=======================\r\n");
	//printf(" apache .........3");

	log.writeLog("************************************传输开始***********************************");	

	//printf(" apache .........4");
	memset(dealBuf,0,DEAL_BUF_LEN);//把dealBuf数组清0
	memset(signCode,0,SIGN_CODE_LEN);
	memset(fileName,0,FILE_NAME_LEN);	
	memset(fileblock,0,BLOCK_LEN);
	memset(uploadid,0,12);
	//memset(hashString,0,HASH_LEN);	
	nowReadLen = 0;

	blockStartP = (const char*)&fileblock;//始终指向文件头
	blockWriteP = (char*)&fileblock;//把块指针给文件块char数组flieblock

	//初始化BDB
	bdb.PS_dbfsms_init(bdbNormalIni,bdbTmpIni,bdbEnvPath);
	logP = &log;
	rspfile = CUspRspfile(logP);

	/***************************************************************************
	//处理环境变量与HTTP头信息
	****************************************************************************/
	if((char *)getenv("CONTENT_LENGTH")!=NULL)
	{
		contentLength = atoi((char *)getenv("CONTENT_LENGTH"));//得到环境变量 atoi转换成整数
		
		//初始化刻度
		for(int i=0;i<PROCESS_LEN;i++)
		{
			processScale[i] = i;
			processNum[i] = (float)contentLength/PROCESS_LEN;
		}
	}
	else
	{
		log.writeLog("没有数据!");
		exit(1);
	}
	
	//得上传代号参数
	if((char *)getenv("QUERY_STRING")!=NULL)
	{		
		char * query_string; 
		query_string= (char *)getenv("QUERY_STRING");//得到环境变量 atoi转换成整数
		char *s_P;
		s_P = query_string+strlen(UPLOAD_ID_PARM)+1;
		strncpy(uploadid,s_P,12);		
		log.writeLog("uploadid = ",uploadid);
	}	
 
	/***************************************************************************
	//开始读POST过来的数据
	****************************************************************************/
	while(contentLength > 0)
	{
		if(contentLength >= DEAL_BUF_LEN)//如果内容大于或者等于1024Bytes,nowReadLen=1024
		{
			nowReadLen = DEAL_BUF_LEN;
		}
		else//如果内容小1024Bytes,nowReadLen=文件大小
		{
			nowReadLen = contentLength;
		}
		contentLength -= nowReadLen;//确认已经把已经读过的长度减掉

		if(fread(dealBuf,sizeof(char),nowReadLen,stdin) != nowReadLen)//从标准输入按Char来读文件
		{
			log.writeLog("读取数据错误!");
			exit(1);
		}
		nowReadP = dealBuf;//把指针nowReadP指向dealBuff字符数组dealBuf	

		//log.writeLog("nowReadLen = ",nowReadLen);
		//log.writeLog("nowReadP 0 =",nowReadP);

		while(nowReadLen > 0)
		{
			switch (getState)
			{
				case STATE_START://初始化
				{
					nowWriteP = signCode;
					getState = STATE_GET_SIGN_CODE;
				}
				case STATE_GET_SIGN_CODE://得到signCode
					if(strncmp(nowReadP,"\r\n",2) == 0)
					{
						signCodeLen = nowWriteP - signCode;
						nowReadP++;
						nowReadLen--;
						printProcess(currentread++);
						*nowWriteP = 0;
						getState = STATE_GET_FILE_NAME;
					}
					else
					{						
						*nowWriteP = *nowReadP;
						nowWriteP++;
					}
				break;
				case STATE_GET_FILE_NAME://得到需要处理的文件
					if(strncmp(nowReadP,"filename=",strlen("filename=")) == 0)
					{
						nowReadP += strlen("filename=");
						nowReadLen -= strlen("filename=");
						printProcess(currentread++,9);//filename= 长度为9
						//只要文件名不用路径
						//nowWriteP = fileName + strlen(FILE_SAVE_DIR);						
						nowWriteP = fileName ;						
						while(*nowReadP != '\r')
						{
							if(*nowReadP == '\\')
							{
								//nowWriteP = fileName + strlen(FILE_SAVE_DIR);
								//只要文件名不用路径
								nowWriteP = fileName;
							}
							else if(*nowReadP != '\"')
							{
								*nowWriteP = *nowReadP;//读指针的值和写指针进行对拷
								nowWriteP++;
							}
							nowReadP++;
							nowReadLen--;
							printProcess(currentread++);
						}
						*nowWriteP = 0;
						nowReadP++;
						nowReadLen--;
						printProcess(currentread++);
						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);
						}
						*/
						//log.writeLog("fileName = ",fileName);						
					}
				break;
				case STATE_GET_FILE_START:
					if(strncmp(nowReadP,"\r\n\r\n",4) == 0)
					{
						nowReadP += 3;//只偏移三位,指到\n,然后break后,nowReadP会再加一
						nowReadLen -= 3;
						printProcess(currentread++,3);
						getState = STATE_GET_FILE_CONTENT;
					}
				break;
				case STATE_GET_FILE_CONTENT:
					if(*nowReadP != '\r')//如果没有回车符,就往文件写
					{			
						//操作文件块
						operateBlock(&blockWriteP,nowReadP);
						//fputc(*nowReadP,fp);
						filesize++;
					}
					else
					{
						if(nowReadLen >= (signCodeLen + 2))//如果指针没有读到了sigCode了
						{
							if(strncmp(nowReadP + 2,signCode,signCodeLen) == 0)//如果刚好读到了signcode,就结束了
							{
								getState = STATE_END;
								nowReadLen = 1;//变成1,Case完了后减一就跳出循环了
								operateLastBlock();
								log.writeLog("************************************传输完成***********************************");
							}
							else
							{	
								//进行块操作
								operateBlock(&blockWriteP,nowReadP);
								//fputc(*nowReadP,fp);
								filesize++;								
							}
						}
						else//当前的nowReadLen小于singcode+2,就要判断一下是否到结尾,跳到Case state_check_end去检查
						{
							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;
									operateLastBlock();
									log.writeLog("###############################传输完成##################################");
								}
								else
								{
									//进行块操作
									operateBlock(&blockWriteP,tmpSignCode,tmpLen);
									//写文件
									//fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
									filesize+=tmpLen;
									getState = STATE_GET_FILE_CONTENT;
								}
							}
						}
					}
					else
					{
						//进行块操作
						operateBlock(&blockWriteP,tmpSignCode,tmpLen);				
						
						//写文件
						*nowWriteP = 0;
						//fprintf(fp,tmpSignCode);						
						//fwrite(tmpSignCode,sizeof(char),tmpLen,fp);
						filesize+=tmpLen;
						nowWriteP = tmpSignCode;
						*nowWriteP = *nowReadP;
						nowWriteP++;
						tmpLen = 1;
					}
				break;
				case STATE_END:
					nowReadLen = 1;					
				break;
				default:break;
			}
			nowReadP++;
			nowReadLen--;			
			printProcess(currentread++);
		}
	}
	/**
	if(fp != NULL)
	{
		fclose(fp);		
	}
	*/

	log.writeLog("filesize  = ",filesize);
	log.writeLog("finished , process  = ",100);
	
	log.closeLog();//关闭日志
	printf("完成了");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -