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


留言

這個網誌中的熱門文章

在嵌入式linux系統中使用android adbd,PC可直接透過USB對console下指令

如何建立chromium firmware updater測試環境