閱讀866 返回首頁    go 阿裏雲 go 技術社區[雲棲]


利用Socket提交文件到web server

    前一段時間開發一個WebDAV的客戶端,主要是接受發送文件。因為隻需要上傳下載文件,所以不想使用curl這樣重量級的庫,所以,基於以上原因自己編寫封裝一個類,利用socket完成對文件的上傳和下載,還可以使用內核函數sendfile實現文件上傳時的“零拷貝”。在本例中,同樣也給出使用curl方式對文件進行上傳操作的方法。針對WebDav的開發還有一個專門的庫neon,同樣這裏也給出使用neon庫完成文件上傳操作的方法。

    在上傳過程中會把大於2M的文件,按2M發送,以防止,當上傳文件過大時並且數量過多時,不能及時對其他非文件處理操作請求做出處理。

具體項目說明如下

    USocket類(USocket.hUSocket.cc),創建到遠程Web server的本地socket連接,它需要遠程的hostport參數,這倆個參數可以從UUri類中獲得。

    UUri(UUri.hUUri.cc),傳遞給該類一個URL,比如https://www.exuetang.net:8080/test/test.jpg,該類會把此URL分解為scheme,host,port,path等信息

    Putfile類(Putfile.hPutfile.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

輸出如下的log

Putfile.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

  上一篇:go linux磁帶機的使用
  下一篇:go 初探模板元編程