首页 > 代码库 > TreeFrog (C++ Web Framework)开发之http文件服务器

TreeFrog (C++ Web Framework)开发之http文件服务器

  开发者使用 treefrog 建立的工程,生成的是动态库,会被 tfserver 加载,tfserver 将 URL 处理为 controller 、 action 、 argument 三部分,参考 URL Routing 这个文档。如下:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /controller-name/action-name/argument1/argument2/...  


    对应到我们的 fileserver 这个工程,controller-name 是 fileserver , action-name 是files ,argument1 是具体的文件名。访问文件时使用这样的地址:http://localhost:8800/fileserver/files/xxx 。

    我们简单的改造之前的 HelloWorld 示例即可得到一个 http 文件服务器。

    头文件如下:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #ifndef FILESERVERCONTROLLER_H  
  2. #define FILESERVERCONTROLLER_H  
  3. #include "applicationcontroller.h"  
  4.   
  5. class T_CONTROLLER_EXPORT FileServerController : public ApplicationController  
  6. {  
  7.     Q_OBJECT  
  8. public:  
  9.     FileServerController(){}  
  10.     FileServerController(const FileServerController &other);  
  11.   
  12. public slots:  
  13.     void index();  
  14.     void files();  
  15.     void files(const QString &param);  
  16. };  
  17.   
  18. T_DECLARE_CONTROLLER(FileServerController, fileservercontroller);  
  19.   
  20. #endif // FILESERVERCONTROLLER_H  


    上述代码中,public slots: 下面的部分就是 action 。当 tfserver 解析完 URL 后,就会调用到这些 action 。我们添加了两个名为 files 的 slot 。

    下面是源文件:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include "fileservercontroller.h"  
  2. FileServerController::FileServerController(const FileServerController &other)  
  3.     : ApplicationController()  
  4. {}  
  5.   
  6. void FileServerController::index()  
  7. {  
  8.     renderText("Denied");  
  9. }  
  10.   
  11. void FileServerController::files()  
  12. {  
  13.     renderText("Invalid parameter");  
  14. }  
  15.   
  16. void FileServerController::files(const QString &param)  
  17. {  
  18.     sendFile(param, "application/octet-stream", "");  
  19. }  
  20.   
  21. 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文件服务器