CGIC提供一些上傳檔案的API,讓您可以輕鬆的利用這些API處理上傳檔案。
注意,您的form必須將enctype設定為multipart/form-data。
<html>
<head><title>upload test</title></head>
<body>
<form method="post" enctype="multipart/form-data"
action="upload.cgi">
<input type="file" name="fileName" />
<input type="submit" />
</form>
</body>
</html>
接著就是處理CGI的部份了。
1. 首先就是利用cgiFormFileName()檢查檔案是否被提交。
2. 接著利用cgiFormFileOpen()取得cgiFilePtr的object。
3. 再利用while(cgiFormFileRead(cgiFilePtr) == cgiFormSuccess)讀取資料。
4. 利用cgiFormFileClose(cgiFilePtr)釋放不再需要的cgiFilePtr。
#include <stdio.h>
#include <cgic.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define F_FILENAME "fileName"
#define FILENAME_LEN 1024
#define BUF_LEN 1024
int cgiMain(int argc, char *argv[])
{
cgiFilePtr cfp;
char rfile[FILENAME_LEN] /*remote file */ ,
lfile[FILENAME_LEN] /* local file */ , buf[BUF_LEN];
int ret, fd, fsize, got;
cgiHeaderContentType("text/html");
if ((ret = cgiFormFileName(F_FILENAME, rfile, sizeof(rfile))) !=
cgiFormSuccess) {
fprintf(cgiOut, "<p>No file was uploaded.(%d)</p>", ret);
return -1;
}
cgiFormFileSize(F_FILENAME, &fsize);
if ((ret = cgiFormFileOpen(F_FILENAME, &cfp)) != cgiFormSuccess) {
fprintf(cgiOut, "<p>open cgi file failed.(%d)</p>", ret);
return -1;
}
snprintf(lfile, sizeof(lfile), "/tmp/%s", rfile);
fprintf(cgiOut, "write to %s", lfile);
if ((fd =
open(lfile, O_CREAT | O_WRONLY,
S_IRWXU | S_IRWXG | S_IRWXO)) < 0) {
fprintf(cgiOut, "<p>create file on server failed.(%s)</p>",
strerror(errno));
return -1;
}
while (cgiFormFileRead(cfp, buf, sizeof(buf), &got) == cgiFormSuccess) {
if ((ret = write(fd, buf, got)) < 0) {
fprintf(cgiOut, "<p> write failed(%d/%s)</p>\n", errno,
strerror(errno));
}
fprintf(cgiOut, "<p>got(%d)</p>\n", got);
}
close(fd);
cgiFormFileClose(cfp);
fprintf(cgiOut, "<p> end </p>\n");
return 0;
}
基本上,I/O讀取上利用buffered I/O是比較有效率的,不過範例沒有用buffered I/O,留給大家去修改一下吧。
參考資料: http://www.boutell.com/cgic/