📄 ps_usp_upload.cpp
字号:
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 + -