这段时间在做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;
}
后面时间是要弄一个不重复的名字保存图片