利用Socket提交文件到web server
前一段時間開發一個WebDAV的客戶端,主要是接受發送文件。因為隻需要上傳下載文件,所以不想使用curl這樣重量級的庫,所以,基於以上原因自己編寫封裝一個類,利用socket完成對文件的上傳和下載,還可以使用內核函數sendfile實現文件上傳時的“零拷貝”。在本例中,同樣也給出使用curl方式對文件進行上傳操作的方法。針對WebDav的開發還有一個專門的庫neon,同樣這裏也給出使用neon庫完成文件上傳操作的方法。
在上傳過程中會把大於2M的文件,按2M發送,以防止,當上傳文件過大時並且數量過多時,不能及時對其他非文件處理操作請求做出處理。
具體項目說明如下
USocket類(USocket.h和USocket.cc),創建到遠程Web server的本地socket連接,它需要遠程的host和port參數,這倆個參數可以從UUri類中獲得。
UUri類(UUri.h和UUri.cc),傳遞給該類一個URL,比如https://www.exuetang.net:8080/test/test.jpg,該類會把此URL分解為scheme,host,port,path等信息
Putfile類(Putfile.h和Putfile.cc),上傳文件操作類,通過putfile方法,需要webPath和本地文件的path,返回操作狀態,以及文件大小。
調用方法
#include using namespace::std; #include "Putfile.h" #define FILENAME "/tmp/file/1.8m.JPG" using namespace::ucs; /* 上傳文件 */ void putfile(const string& webPath, const string& filename) { Putfile client; int fileSize; // 上傳文件 UState state = client.putfile(webPath,filename,fileSize); if(state == U_OK) cout << filename << " -- OK, file size " << fileSize << endl; else cout << filename << " -- fail" << state << endl; } int main ( int argc, char *argv[] ) { if(argc != 3) { cout << "./Client method /n"; cout << " ./Client webPath fileName/n"; return 0; }else{ string strWeb = argv[1]; string strFile = argv[2]; putfile(strWeb,strFile); } return EXIT_SUCCESS; }執行make命令,然後
./Client https://www.xxx.com/test.dat test.dat
輸出如下的logPutfile.cc/_sectsendfile[348]: end recv 3784 Putfile.cc/_sectsendfile[351]: send file size: 114688 Putfile.cc/putfile[137]: put file OK Putfile.cc/putfile[140]: send size 114688| file size 160650 USocket.cc/~USocket[33]: USocket::~USocket() UUri.cc/~UUri[28]: UUri::~UUri /tmp/example/abc.jpg -- OK, file size 160650 Putfile.cc/~Putfile[52]: Putfile::~Putfile()
如果不使用sendfile,使用neon庫或者curl庫,需要修改Makefile文件,增加-lneon或者-lcurl庫,同時修改Macros.h文件。如果不想顯示日誌,注釋掉Logging.h文件中的
#define DEBUG_MODE即可,具體操作參考源代碼。
點擊下載
最後更新:2017-04-02 00:06:30