利用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