TreeFrog (C Web Framework)開發之http檔案伺服器

NO IMAGE

    開發者使用 treefrog 建立的工程,生成的是動態庫,會被 tfserver 載入,tfserver 將 URL 處理為 controller 、 action 、 argument 三部分,參考 URL
Routing
 這個文件。如下:

/controller-name/action-name/argument1/argument2/...

    對應到我們的 fileserver 這個工程,controller-name 是 fileserver , action-name 是files ,argument1 是具體的檔名。訪問檔案時使用這樣的地址:http://localhost:8800/fileserver/files/xxx 。

    我們簡單的改造之前的 HelloWorld 示例即可得到一個 http 檔案伺服器。

    標頭檔案如下:

#ifndef FILESERVERCONTROLLER_H
#define FILESERVERCONTROLLER_H
#include "applicationcontroller.h"
class T_CONTROLLER_EXPORT FileServerController : public ApplicationController
{
Q_OBJECT
public:
FileServerController(){}
FileServerController(const FileServerController &other);
public slots:
void index();
void files();
void files(const QString &param);
};
T_DECLARE_CONTROLLER(FileServerController, fileservercontroller);
#endif // FILESERVERCONTROLLER_H

    上述程式碼中,public slots: 下面的部分就是 action 。當 tfserver 解析完 URL 後,就會呼叫到這些 action 。我們新增了兩個名為 files 的 slot 。

    下面是原始檔:

#include "fileservercontroller.h"
FileServerController::FileServerController(const FileServerController &other)
: ApplicationController()
{}
void FileServerController::index()
{
renderText("Denied");
}
void FileServerController::files()
{
renderText("Invalid parameter");
}
void FileServerController::files(const QString &param)
{
sendFile(param, "application/octet-stream", "");
}
T_REGISTER_CONTROLLER(fileservercontroller);

    我們在 files 的實現中,僅僅是呼叫 sendFile 來傳送檔案。其實跟蹤 sendFile 會發現,這個函式僅僅是找到檔案並開啟,將一個 QIODevice 物件指標賦值給 THttpResponse 的 bodyDevice 成員。後續會在 TActionThread 中用這個 bodyDevice 做實際的資料傳送動作。在開啟檔案時,param會作為檔名,在網站根目錄下查詢(示例中是工程根目錄)。

    現在,我們可以通過 http://localhost:8800/fileserver/files/appbase.pri 這個 URL 來測試一下下載。我這裡是正常工作的。