基於RTOS的c語言實現http檔案上傳
阿新 • • 發佈:2019-02-17
本實驗為了減少程式碼量,使用了封裝比較完善的http庫,本文主要講述http檔案上傳的主要要求。
一、分析http關鍵頭部資訊
為了分析http header,我們通過chrome得到上傳檔案時的http資訊:
通過上面的截圖我們可以發現,關鍵頭部資訊為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),那這個長度到底是多大?請看下圖:
從圖中我們不難看出,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上傳就是這麼簡單,你現在想試試?