lighttpd + fcgi + C language to do file upload & download
最近使用lighttpd當作http server
搭配fcgi來寫檔案上傳跟下載功能
比較討厭的是,html我完全不會寫啊~~~
還有fcgi的範例也非常地缺乏
其他語言有很多相關API可以使用
C語言的話就得要自己寫
這邊就講一下是怎樣實現的
首先是下載的部分:
一開始得先要有個html給人下載
可以使用下面的範例
printf("Content-type: text/html\r\n"
printf("<hr />");
printf("<a href='/download/?message'>message</a>");
printf("<hr />");
當有人點選"message"後會跳轉另一個網址
之後可以利用queryString = getenv("QUERY_STRING");
去判別server跳轉進來的下載網址
此時需要提供另一個html告訴browser要下載東西
printf("Content-type: application/octet-stream\r\n");
printf("Content-Transfer-Encoding: Binary\r\n");
printf("Content-Length: %d\r\n", size);
printf("Content-Disposition:attachment;filename=message\r\n\r\n");
當然,你的c code裡面要做開檔並傳送的動作
較完整的範例如下
while(FCGI_Accept() >= 0) {
queryString = getenv("QUERY_STRING");
if(strstr(queryString, "message"))
{
printf("Content-type: application/octet-stream\r\n");
printf("Content-Transfer-Encoding: Binary\r\n");
printf("Content-Length: %d\r\n", size);
printf("Content-Disposition:attachment;filename=message\r\n\r\n");
FCGI_FILE * fileOut = FCGI_fopen("message", "rb");
if (fileOut) {
int packetRead;
packetRead = FCGI_fread(buffer, 1, sizeof(buffer), fileOut);
while(packetRead > 0) {
packetRead = FCGI_fread(buffer, 1, sizeof(buffer), fileOut);
if (packetRead < 0) {
break;
}
if (packetRead > 0)
FCGI_fwrite(buffer, 1, packetRead, stdout);
}
FCGI_fclose(fileOut);
}
}
上傳其實也差不多
html寫法是這樣
char *contentLength = getenv("CONTENT_LENGTH");
printf("Content-type: text/html\r\n"
"\r\n"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_NAME"));
printf("<br />CONTENT_LENGTH = %d <br />\r\n", len);
printf("<form enctype='multipart/form-data' method='post' action='?'><input type='text' name='text1' /><input type='file' name='file1'/><input type='submit' /></form>");
printf("<hr />");
然後fcgi的寫法基本上就跟download是一樣的
只不過fread從rb換成wb,fileOut換成stdin(從stdin獲得資料)
fwrite從stdout換成fileOut
搭配fcgi來寫檔案上傳跟下載功能
比較討厭的是,html我完全不會寫啊~~~
還有fcgi的範例也非常地缺乏
其他語言有很多相關API可以使用
C語言的話就得要自己寫
這邊就講一下是怎樣實現的
首先是下載的部分:
一開始得先要有個html給人下載
可以使用下面的範例
printf("Content-type: text/html\r\n"
printf("<hr />");
printf("<a href='/download/?message'>message</a>");
printf("<hr />");
當有人點選"message"後會跳轉另一個網址
之後可以利用queryString = getenv("QUERY_STRING");
去判別server跳轉進來的下載網址
此時需要提供另一個html告訴browser要下載東西
printf("Content-type: application/octet-stream\r\n");
printf("Content-Transfer-Encoding: Binary\r\n");
printf("Content-Length: %d\r\n", size);
printf("Content-Disposition:attachment;filename=message\r\n\r\n");
當然,你的c code裡面要做開檔並傳送的動作
較完整的範例如下
while(FCGI_Accept() >= 0) {
queryString = getenv("QUERY_STRING");
if(strstr(queryString, "message"))
{
printf("Content-type: application/octet-stream\r\n");
printf("Content-Transfer-Encoding: Binary\r\n");
printf("Content-Length: %d\r\n", size);
printf("Content-Disposition:attachment;filename=message\r\n\r\n");
FCGI_FILE * fileOut = FCGI_fopen("message", "rb");
if (fileOut) {
int packetRead;
packetRead = FCGI_fread(buffer, 1, sizeof(buffer), fileOut);
while(packetRead > 0) {
packetRead = FCGI_fread(buffer, 1, sizeof(buffer), fileOut);
if (packetRead < 0) {
break;
}
if (packetRead > 0)
FCGI_fwrite(buffer, 1, packetRead, stdout);
}
FCGI_fclose(fileOut);
}
}
上傳其實也差不多
html寫法是這樣
char *contentLength = getenv("CONTENT_LENGTH");
printf("Content-type: text/html\r\n"
"\r\n"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_NAME"));
printf("<br />CONTENT_LENGTH = %d <br />\r\n", len);
printf("<form enctype='multipart/form-data' method='post' action='?'><input type='text' name='text1' /><input type='file' name='file1'/><input type='submit' /></form>");
printf("<hr />");
然後fcgi的寫法基本上就跟download是一樣的
只不過fread從rb換成wb,fileOut換成stdin(從stdin獲得資料)
fwrite從stdout換成fileOut
留言
張貼留言