您的位置:首页 > 理论基础 > 计算机网络

CGI程序: 获得HTTP POST上传的文件,并保存在本地

2015-01-10 23:31 417 查看
#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/stat.h>

#include"cgic.h"

//author pdfccc@sina.com

#define BufferLen 4096

#define MAX_FILE_SIZE 20000000 // 10M

int cgiMain()

{

cgiFilePtr file;

int targetFile;

mode_t mode;

char name[256];

char fileNameOnServer[256];

char contentType[1024];

char buffer[BufferLen];

char* tmpStr = NULL;

int size;

int got, t;

cgiHeaderContentType("text/html");

//取得html页面中file元素的值,应该是文件在客户机上的路径名

cgiFormResultType ret = cgiSYSErr;

ret = cgiFormFileName("upload_file_name", name , sizeof(name));

if( ret != cgiFormSuccess )

{

fprintf(stderr ,"Could not retrieve filename. ret=%d. \n", ret);

goto FAIL;

}

else

{

printf("File name = %s. \n <br>", name);

}

cgiFormFileSize("upload_file_name", &size);

printf("File size = %d.\n <br>", size);

if ( size > MAX_FILE_SIZE )

{

printf("File size too big. should less than 20M.");

goto FAIL;

}

//取得文件类型,不过本例中并未使用

cgiFormFileContentType("upload_file_name", contentType , sizeof(contentType));

printf("ContentType = %s.\n <br>", contentType);

//web容器把文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。

//临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件

if( cgiFormFileOpen("upload_file_name", &file) != cgiFormSuccess)

{

fprintf(stderr ,"could not open the file. \n");

goto FAIL;

}

t = -1;

//从路径名解析出用户文件名

while(1)

{

tmpStr = strstr(name + t + 1 ,"\\");

if(NULL == tmpStr) tmpStr = strstr(name + t + 1 ,"/"); //if"\\"is not path separator, try"/"

if(NULL != tmpStr) t =(int)( tmpStr-name);

else break;

}

strcpy(fileNameOnServer, "uploaded/");

strcat(fileNameOnServer, name + t + 1); //只包含文件名

//mode = S_IRWXU | S_IRGRP | S_IROTH; //0666

printf("ready write to server path: %s. <br>", fileNameOnServer);

mode = 0666;

//在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在cgi程序所在的目录(当前目录)建立新文件

targetFile = open(fileNameOnServer , O_RDWR|O_CREAT|O_TRUNC|O_APPEND , mode);

if( targetFile < 0)

{

fprintf(stderr ,"could not create the new file, %s. \n", fileNameOnServer);

goto FAIL;

}

printf("<br>");

//从系统临时文件中读出文件内容,并放到刚创建的目标文件中

while(cgiFormFileRead(file , buffer , BufferLen , &got) == cgiFormSuccess)

{

if(got > 0) write(targetFile , buffer , got);

printf(".");

}

cgiFormFileClose(file);

close(targetFile);

goto END;

FAIL:

fprintf(stderr ,"Failed to upload.");

return 1;

END:

printf("File %s has been uploaded.", fileNameOnServer);

printf("<br><br> 下载该文件请使用: <H3>http://172.27.194.147:8080/js/%s</H3> <br>", fileNameOnServer);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: