Http服务器实现文件上传与下载(五)(1)


一、引言

欢迎大家和我一起编写Http服务器实现文件的上传和下载,现在我回顾一下在上一章节中提到的一些内容,之前我已经提到过文件的下载,在文件的下载中也提到了文件的续下载只需要在响应头中填写Content-Range这一字段,并且服务器的文件指针指向读取的指定位置开始读取传输。在这一章节中我讲讲解文件的上传这一功能,讲完这一章节,大致的功能也全部完成,接着就是上面文件控制模块和一些资源模块。

在文件的上传中主要以HttpRequest类为主,在考虑文件的上传时我一点迷惑,到底把文件的上传功能是放到HttpResponse下还是在HttpRequest下,毕竟HttpResponse中有一些相应的文件下载功能,在添加一个文件上传功能也不为过。但是我最终还是选择在HttpRequest中,原因是我主要是HttpResponse作为是服务器到浏览器发送内容,而HttpRequest作为浏览器到服务器发送内容。这样下载和上传的功能就分别坐落在了HttpResponse和HttpRequest上了。

在完成功能上的归属问题后,接着直接上代码,在文件的上传中,涉及到C++流。在这里其实用到不是很多的内容,但是这却是C++一个重要的一大块内容。有时间和大家在一起复习这一块内容。好了,接着上代码咯,上一章的内容有设计一些HttpRequest的代码,没有全部的包括进去。

二、HttpRequest

头文件(include/httprequest.h)

1 #ifndef HTTPREQUEST_H
2 #define HTTPREQUEST_H
3 #include "socket.h"
4 #include 
5 #include 
6 #include 
7 namespace Http{
8 class HttpRequest{
9 public:
10 HttpRequest(TCP::Socket &c);
11 virtual ~HttpRequest();
12 std::string getMethod() const;
13 std::string getUrl() const;
14 std::string getHost() const;
15 std::map
16 ssize_t upload(int confd,std::string filename);
17 protected:
18 private:
19 std::string method;
20 std::string url;
21 std::string host;
22 TCP::Socket &s;
23 };
24 }
25 #endif // HTTPREQUEST_H

源文件(src/httprequest.cpp)

1 #include "httprequest.h"
2 #include "utils.h"
3 namespace Http{
4 HttpRequest::HttpRequest(TCP::Socket &c):s(c){
5 }
6
7 HttpRequest::~HttpRequest(){
8 }
9 std::map
10 char recvBuf[1024];
11 memset(recvBuf,0,sizeof(recvBuf));
12 s.server_read(confd,recvBuf,1024);
13 std::cout<
14 std::map
15 method =mp["Method"];
16 url=mp["Url"];
17 host=mp["Host"];
18 return mp;
19 }
20 ssize_t HttpRequest::upload(int confd,std::string filename){
21 char buf[1024];
22 size_t n=0;
23 ssize_t nread=0;
24 std::string boundary;
25 std::string file;
26 std::ofstream outStream;
27 int readlineCount=1;
28 while(1){
29 memset(buf,0,sizeof(buf));
30 n=s.server_readline(confd,buf,sizeof(buf));
31 if(readlineCount==1){
32 boundary=std::string(buf,buf+strlen(buf)-2);
33 boundary+="--\r\n";
34 std::cout<
 




相关内容