首页 > 代码库 > TreeFrog (C++ Web Framework)开发之http文件服务器
TreeFrog (C++ Web Framework)开发之http文件服务器
开发者使用 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 ¶m);
- };
- 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 ¶m)
- {
- 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 来测试一下下载。我这里是正常工作的。
TreeFrog (C++ Web Framework)开发之http文件服务器