1. 程式人生 > >基於RTOS的c語言實現http檔案上傳

基於RTOS的c語言實現http檔案上傳

本實驗為了減少程式碼量,使用了封裝比較完善的http庫,本文主要講述http檔案上傳的主要要求。

一、分析http關鍵頭部資訊

為了分析http header,我們通過chrome得到上傳檔案時的http資訊:

html_header.PNG

通過上面的截圖我們可以發現,關鍵頭部資訊為Content-type和Content-length。一般我們寫html上傳時,都會在form標籤加一個multipart-data屬性表示該表單有檔案上傳輸入域,so我們在使用c實現http上傳的時候,就需要在頭部Content-type項加入multipart-data值,有人會問,誒,那後面的boundary是什麼?
boundary表示的是每個表單輸入域的分界!例:----ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC


好了,Content-type有了,接下來我們需要的就是Content-length項的資訊了。Content-length表示的是請求內容的長度(byte),那這個長度到底是多大?請看下圖:

sum.PNG

從圖中我們不難看出,Content-length=上傳檔案大小+輸入域頭部資訊+輸入域尾部(byte)。
貼上計算長度的程式碼一份作為參考:

int get_data_length(int filesize, char* boundary, char* name, char* filename)
{
    int nSize = 0;
    nSize += strlen("--%s\r\n"
) + strlen(boundary) - 2; nSize += strlen("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n\r\n") + strlen(name) + strlen(filename) - 4; nSize += filesize; nSize += strlen("\r\n--%s--") + strlen(boundary) - 2; return nSize; }

二、傳送請求和檔案

其實在前面的內容基本已經把整篇文章需要講的講清楚了,但是我覺得還是貼上具體實現的程式碼吧!
計算長度:

int get_data_length(int filesize, char* boundary, char* name, char* filename)
{
    int nSize = 0;
    nSize += strlen("--%s\r\n") + strlen(boundary) - 2;
    nSize += strlen("Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n\r\n") + strlen(name) + strlen(filename) - 4;
    nSize += filesize;
    nSize += strlen("\r\n--%s--") + strlen(boundary) - 2;
    return nSize;
}

經過計算得出這次上傳內容的長度,新增到請求頭,那麼請求頭的基本需要的關鍵資訊也已經完成了,之後我們傳送該請求。

HTTPAddRequestHeaders( "Content-Type","multipart/form-data; boundary=----ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC");//新增Content-Type
HTTPAddRequestHeaders("Content-Length",get_data_length(filesize, boundary, name, filename));//新增Content-Length
HTTPSendRequest(uri);//傳送請求

當我們傳送請求成功,就證明客戶端已經與伺服器建立了tcp連線了,接下來我們繼續傳送http內容給伺服器就行了。
構建上傳內容:

char *Buffer=malloc(512);
nSize = 0;
nSize += sprintf(Buffer+nSize, "--%s\r\n", boundary);
nSize += sprintf(Buffer+nSize, "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n\r\n", "pic", "test.mp3");
HTTPWriteData(Buffer, nSize);
do{
      menset(Buffer,0,strlen(Buffer));
      nSize = ReadFile(File,Buffer,512);//讀取檔案
      HTTPWriteData(Buffer,nSize);//傳送檔案內容
}while(nSize>0)
menset(Buffer,0,strlen(Buffer));                        
nSize = sprintf(Buffer, "\r\n--%s--", boundary);
HTTPWriteData(Buffer, nSize);                               

好了,一個檔案的http上傳就是這麼簡單,你現在想試試?