0

我正在开发一个必须与浏览器配合使用的简单服务器。当我给它一些命令时,它必须用一些 html 代码回复我,以便回复我的答案。例如,我可以看到文件夹的文件列表等。我可以使用 localhost:port/somecommand 访问我的服务器 现在我正在从本地硬盘下载文件。我想要做的是输入一个像 localhost:port/download/filepath 这样的 url 并让浏览器下载它。当我创建回复时,我把所有东西 html 都需要了解有一个文件要下载,事实上我有一个经典的弹出窗口,要求我下载文件,但我收到的比原来的文件大到硬盘,实际上文件已损坏。这里的代码:

这是我发回的 html

HTTP/1.0 200 OK
Date: Tue Apr 10 16:23:55 2012
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=mypic.jpg
Content-Length: 2574359
                       //empty line here

(我遵循了 Content-Disposition Header Field text

然后我从文件中读取,然后先发回 html,然后从文件中读取:

int file=open(name,O_RDONLY);
void * data=malloc(buf.st_size+1); //buf.st_size is the correct file size
size_t readed=read(file,data,buf.st_size);
send(sd_current, html, DIRSIZE, 0); //html is a string containing what you I showed you 
send(sd_current, data, readed);

这导致我可以使用 localhost:port/download/filepath 下载的文件比原始文件大然后损坏,但我无法摆脱原因。有人能帮我吗?

4

2 回答 2

0

检查事项:

  1. DIRSIZE 真的是 http 标头的大小吗?(因为大小应该不同,大写字母通常意味着不变)。
  2. 读取成功了吗?
  3. 文件是如何损坏的?
  4. http 标头上的行尾是否正确?他们应该是\r\n

编辑:

如果 DIRSIZE 不是标头的大小,则缓冲区的其余部分(包含 NULL 或垃圾)将被发送到其他大小。

所以对方看到 HTTP 标头,然后开始接收数据——从html缓冲区的其余部分开始,然后是文件的内容。

然后根据接收者的不同,它要么在Content-Length标头大小处停止,要么在流仍在传输数据时继续。

这是否与您的结果内容相匹配:开头有些垃圾,然后是预期的文件内容?

于 2012-04-10T14:50:46.880 回答
0

Content-Length: 2574359, 2574359 应该是您的 jpg 文件的大小,但我在您的代码中看不到任何内容将其放入 html 部分。buf.st_size == 2574359 ?

于 2012-04-10T17:27:31.470 回答