Chinaunix

标题: [文件] 如何利用http协议传送文件? [打印本页]

作者: locallocal    时间: 2006-06-14 16:32
标题: [文件] 如何利用http协议传送文件?
客户端是window,服务端是linux(apache),客户端通过http发送数个字段到linux服务端,linux服务端根据字段查找数据库,将文件用http协议发送回window。
我想知道的是,如果用c写代码,如何使用http协议(html??)传送文件回windows的客户端???

[ 本帖最后由 HonestQiao 于 2006-6-29 11:51 编辑 ]
作者: whitewolf009    时间: 2006-06-16 21:07
没见过用C写的,怎么不用CGI写?
作者: locallocal    时间: 2006-06-17 09:55
cgi不也是可以由多种语言实现么?
作者: xabbca    时间: 2006-06-17 15:46
php吧,很好用,perl也很方便

参考此贴:
http://bbs.chinaunix.net/viewthr ... 4%26filter%3Ddigest

[ 本帖最后由 xabbca 于 2006-6-17 15:51 编辑 ]
作者: newzy    时间: 2006-06-18 19:54
首先根据输出文件的类型确定 mime 头信息,
如果是一般文件mime头请用 text/plain 类型, jpg 图image/jpeg, gif 图片 image/gif, ...
其次确定输出文件的文件名, 和要输入的内容,

如,

  1. main() {
  2. printf("Content-Type: text/plain\n");
  3. printf("Content-Disposition: attachment; filename=test.txt\n\n");
  4. printf("Hello world, this is a test file, name: test.txt");
  5. }
复制代码


建议:
C 写 CGI 不妨试试专业 开发CGI 的C 工具 CSP/eybuild
http://www.eybuild.com

祝你好运

[ 本帖最后由 newzy 于 2006-6-18 19:55 编辑 ]
作者: locallocal    时间: 2006-06-19 15:58
谢谢楼上的,但是怎样还是会出现一个对话框,有没有方法不要这个对话框,直接就下载了?
作者: jhsea3do    时间: 2006-06-20 12:14
你提问要求直接返回文件。

浏览器只能打开部分类型的文件,比如 .html,  .jpeg

像 excel, word这样的文件都不一定直接打开。

要调整 Content-Type, Content-Disposition 的内容输出才行

比如 Content-Type: text/html;charset=gb18030
....

请多参考一下http协议方面的内容。
作者: locallocal    时间: 2006-06-20 17:41
这个只能返回一个href,如果用代码来实现的话,是否可以让客户端直接获得整个文件的buffer,然后保存到特定的目录?
现在的问题是,c语言只能通过printf将文件的buffer返回给apache,但是还不一定能显示出来,中间出现了传送的错误,apache如何应对,都是未知的,这样的未知会不会导致数据的正确性
作者: jhsea3do    时间: 2006-06-21 09:54
当然不是输出href, c的我没写过

java的写法是把一个文件用BufferedReader读取,然后输出到浏览器,由于在Content-Type, Content-Disposition的设置,使得浏览器能够认出文件的名称和类型。

而向你所说的,就是没有物理文件,把数据库查询结果输出到文件,那么更加简单了,连BufferedReader都不需要的。估计像newzy那样写就可以了。


其他cgi都是类似写法。

向你上面说的不要弹出一个对话框什么的,这个要看客户的浏览器的,比如mozilla允许在浏览器中browse如下mime的文件

text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

那么你的Content-Type要指定这些类型的,Content-Disposition指示浏览器是“内嵌”显示文件还是把它当作附件处理。

例1.内嵌显示一个文件
Content-disposition: inline; filename=foobar.pdf
例2.往response里附加一个文件
Content-disposition: attachment; filename=foobar.pdf


不多说了,你自己多调试把。
作者: newzy    时间: 2006-06-22 13:09
原帖由 locallocal 于 2006-6-20 17:41 发表
这个只能返回一个href,如果用代码来实现的话,是否可以让客户端直接获得整个文件的buffer,然后保存到特定的目录?
现在的问题是,c语言只能通过printf将文件的buffer返回给apache,但是还不一定能显示出来,中 ...


答案是肯定的,
方案选择:
1. browser 上用 java/vb script 实现接收缓冲
    这种方案是不可行的, 因为出于安全考虑, 它们都被设计成没有能力操作本地磁盘上的文件.

2. 在 browser 安装自定义插件
   这种方案可行, 如 flashget 即可视作这种方案的应用版.
    局限性, 跨平台的移植性差, 与 browser 偶合性强.

3. 自已写简单的下载软件, 通过 http 连接服务器,
    原理简单(参考 HTTP/1.0 和 HTTP/1.1 协议),  方便实用,
    可以做得很像 flashget 等, 现在这种东西网上也很多.

有兴趣看看这个文件上传的进度控制, 原理有可借鉴之处:





Good Luck!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2