【问题标题】:C: simple HTTP server. Read a local file and download it from browserC:简单的HTTP服务器。读取本地文件并从浏览器下载
【发布时间】:2012-04-22 20:47:41
【问题描述】:

我正在开发一个必须与浏览器配合使用的简单服务器。当我给它一些命令时,它必须用一些 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

(我关注了 The 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 下载的文件比原始文件大然后损坏,但我无法摆脱原因。有人可以帮我吗?

【问题讨论】:

  • send(sd_current, html,DIRSIZE); 您打算将其设为 DIRSIZE 还是 html 字符串的长度?
  • 是的,尝试从一个版本到另一个我忘了改变这个..我现在改为 strlen(html),现在我下载的文件只大了 2 个字节!我们很接近:D
  • 好的解决了!!谢谢大家!就是这该死的 DIRSIZE :D 谢谢!

标签: c http attachment send


【解决方案1】:

检查事项:

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

编辑:

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

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

然后根据接收器,它要么停止在Content-Length 标头大小,要么在流仍在传送数据时继续。

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

【讨论】:

  • 1) 是的,当然我没有在这里显示整个代码,但是 DIRSIZE 是 8192 并且 html 标头小于 200 2) 读取和发送没有错误 3) 文件已损坏,因为它更大然后是原始的,所以我认为某处有一些垃圾代码 4)http 标头应该没问题..我没有 \r 然后我添加了它,但没有运气
  • 编辑:我添加了 \r 更好,现在大小有点小,接近文件大小:这里的新代码与以前相同,但发送发送(sd_current,html,DIRSIZE,0);发送(sd_current,数据,buf.st_size,0);字符 * 结束 =“\r\n”;发送(sd_current,结束,strlen(结束),0);无论如何,文件仍然损坏
【解决方案2】:

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

【讨论】:

  • 是的,我使用 stat() 来获得这个大小,甚至 html 也使用这个数字,所以 buf.st_size == 2574359(即文件大小)。我唯一注意到的是生成的文件具有相同的“磁盘大小”但不同的“大小”寻找它们的属性..这有帮助吗?编辑:现在文件只大了 2 个字节!
  • 如果是windows,需要确保读取的数据是“二进制”模式,并且send()的字节大小与content-length标签中的完全相同。确保 read 与 buf.st_size 相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
相关资源
最近更新 更多