cgi上传图片

    这段时间在做CGI的东西,今天写一个上传图片的功能,目的是项目要做一个像QQ头像那样的东西,才会用到上传图片。

html上传图片的协议与传文件的协议有所不同,这网上有很多讲得很好,我就不讲了,我也是根据网上讲的整的程序。

 

int hmc_upload_file(char *returnname, int ls_len)
{
 FILE *fp = NULL; /* 文件指针,保存我们要获得的文件 */
 char *input = NULL; /* 这是用来接收数据流的字符串 */
 int content_length;
 char *content_type = NULL;
 char *boundary = NULL; /* 分隔符*/
 char *p = NULL; /* 位移指针 */
 char *temp_string = NULL;
 int temp_length;
 char *filename = NULL; /* 用来保存文件名*/
 int got_it=0;

 char file_path[256];
 char re_name[32];
 char *loc_time = NULL;
 int i;

 content_type=CONTENT_TYPE;
 temp_string="boundary=";
 temp_length=strlen(temp_string);

 /* 获得boundary的值 */
 for(p=content_type; p!=NULL/* && *p!=' '*/; p++){
  if(!strncmp(p,temp_string,temp_length)){
   //boundary=newstr(p+temp_length);
   boundary = p + temp_length;
   msg_debug("boundary===%s",boundary);
   break;
  }
 }
 /* 判断输入是否合法 */
 if(boundary==NULL){
  msg_error("输入的格式不对,请监查表单是否为form/data型%s","");
  return -1;
 }
 /* 获得输入的数据流 */
 if(getRequestMethod()){
  if(getenv("CONTENT_LENGTH")!=NULL){
   content_length=atoi(getenv("CONTENT_LENGTH"));
   if(content_length > MAX_LEN){//1M
    printf("pic is too large");
    return -1;
   }
   msg_debug("content_length=%d",content_length);
   input=malloc(sizeof(char)*content_length+1);
   if(fread(input,sizeof(char),content_length,stdin)!=content_length){
    msg_debug("error:input length <CONTENT_LENGTH ");
    return -1;
   }
  }else {
   msg_debug("CONTENT_LENGTH is zero");
   return -1;
  }
 }else {
  msg_debug("method should be POST,but yours is not");
  return -1;
 }
 /* 获得文件名 */
 for(p=input; got_it==0;p++) {
  if(strncmp(p,"filename=",strlen("filename="))==0){
   p+=strlen("filename=");
   filename = hmc_find_file_name(p,'//');
   msg_debug("filename=%s",filename);
   break;
  }
 }

 char *ls_name = hmc_find_file_name(filename,'.');
 loc_time = hmc_get_loctime();
 snprintf(re_name,sizeof(re_name),"%s.%s",loc_time,ls_name);
 for (i=0; i<sizeof(re_name); i++){
  if (re_name[i] == '"'){
   re_name[i]='/0';
  }  
 }
 snprintf(file_path,sizeof(file_path),HMC_PIC_PATH"%s",re_name);
 msg_debug("re_name=%s,file_path==%s",re_name,file_path);
 
  /* 从这里调过3行 */
  do{
   p++;
  }while(*p!='/n');

  do{
   p++;
  }while(*p!='/n');

  do{
   p++;
  }while(*p!='/n');

  /* 打开文件 */
  if((fp=fopen(file_path,"w+"))==NULL){
   msg_error("open file error %s",strerror(errno));
   return -1;
  }
  /* 开始写文件 */
  msg_debug("p=%s,boundary=%s",p,boundary);
  for(++p;strncmp(p+3,boundary,strlen(boundary))!=0;p++) /*这里p+3是因为实际的界限要比boundary 长3个字符 */
   fputc(*p,fp);
  free(input);
  fclose(fp);
  snprintf(returnname,ls_len,"%s",re_name);
 return 0;
}

//查找字符最后出现的位置
char *hmc_find_file_name(char *str,int c)
{
 char *p = NULL;
 p = strrchr(str,c);
 if(!p){
  return NULL;
 }
 else{ 
  return p+1;
 }
}

//得到并格式化系统时间
char *hmc_get_loctime()
{
 static char str_time[64];  
 struct tm *local_time = NULL;  
 time_t utc_time;

 utc_time = time (NULL);  
 local_time = localtime(&utc_time);  
 strftime(str_time, sizeof(str_time), "%Y%m%d%H%M%S", local_time);
 return str_time;
}

后面时间是要弄一个不重复的名字保存图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值