使用CGIC如何实现Web文件上传???大神们帮帮忙

使用CGIC如何实现Web文件上传???大神们帮帮忙,第1张

用C语言编写cgi程序的话,CGIC是非常流行的库,官方页面及下载地址为: www.boutell.com/cgic/#obtain 不少网站都有文件上传的功能,本文展示如何用CGIC库编写文件上传的服务端程序,最后给出一段简单的HTML代码,供大家测试使用。//upload.c#include #include #include #include #include #include"cgic.h"#define BufferLen 1024int cgiMain(void){ cgiFilePtr fileint targetFilemode_t modechar name[128]char fileNameOnServer[64]char contentType[1024]char buffer[BufferLen]char *tmpStr=NULLint sizeint got,tcgiHeaderContentType("text/html")//取得html页面中file元素的值,应该是文件在客户机上的路径名 if (cgiFormFileName("file", name, sizeof(name)) !=cgiFormSuccess) { fprintf(stderr,"could not retrieve filename\n")goto FAIL} cgiFormFileSize("file", &size)//取得文件类型,不过本例中并未使用 cgiFormFileContentType("file", contentType, sizeof(contentType))//目前文件存在于系统临时文件夹中,通常为/tmp,通过该命令打开临时文件。临时文件的名字与用户文件的名字不同,所以不能通过路径/tmp/userfilename的方式获得文件 if (cgiFormFileOpen("file", &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,name+t+1)mode=S_IRWXU|S_IRGRP|S_IROTH//在当前目录下建立新的文件,第一个参数实际上是路径名,此处的含义是在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} //从系统临时文件中读出文件内容,并放到刚创建的目标文件中 while (cgiFormFileRead(file, buffer, BufferLen, &got) ==cgiFormSuccess){ if(got>0) write(targetFile,buffer,got)} cgiFormFileClose(file)close(targetFile)goto ENDFAIL: fprintf(stderr,"Failed to upload")return 1END: printf("File \"%s\" has been uploaded",fileNameOnServer)return 0} 假设该文件存储为upload.c,则使用如下命令编辑:gcc -Wall upload.c cgic.c -o upload.cgi 编译完成后把upload.cgi复制到你部署cgi程序的目录(通常命名为cgi-bin)。 正式部署时,请务必修改用open创建新文件那一行代码。把open的第一个参数设置为目标文件在服务器上存储的绝对路径,或者相对于cgi程序的相对路径。本例中,出于简单考虑,在cgi程序所在目录下创建新文件。

修改Makefile文件:

找到CC=gcc,将其改成CC=arm-linux-gcc,

找到AR=ar,将其改成AR=arm-linux-ar,

找到RANLIB=ranlib,将其改成RANLIB=arm-linux-ranlib。

找到gcc cgictest.o -o cgictest.cgi ${LIBS},将其改成$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},

找到gcc capture.o -o capture ${LIBS},将其改成$(CC) $(CFLAGS) capture.o -o capture ${LIBS},并保存退出。1234512345

然后运行make进行编译,编译后得到的CGIC库libcgic.a(该库在需要编写cgi接口程序时调用使用)以及CGI库的测试程序capture与cgictest.cgi,这两个测试程序仅用来演示CGIC库如何使用,为此,将capture和cgictest.cgi拷贝到目标主机的/var/www/cgi-bin目录下。

使用 apache fileupload ,spring MVC jquery1.6x , bootstrap 实现一个带进度条的多文件上传,由于fileupload 的局限,暂不能实现每个上传文件都显示进度条,只能实现一个总的进度条,效果如图:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12005145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存