免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5892 | 回复: 9
打印 上一主题 下一主题

[文件] 如何利用http协议传送文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-14 16:32 |只看该作者 |倒序浏览
客户端是window,服务端是linux(apache),客户端通过http发送数个字段到linux服务端,linux服务端根据字段查找数据库,将文件用http协议发送回window。
我想知道的是,如果用c写代码,如何使用http协议(html??)传送文件回windows的客户端???

[ 本帖最后由 HonestQiao 于 2006-6-29 11:51 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-06-16 21:07 |只看该作者
没见过用C写的,怎么不用CGI写?

论坛徽章:
0
3 [报告]
发表于 2006-06-17 09:55 |只看该作者
cgi不也是可以由多种语言实现么?

论坛徽章:
0
4 [报告]
发表于 2006-06-17 15:46 |只看该作者
php吧,很好用,perl也很方便

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

[ 本帖最后由 xabbca 于 2006-6-17 15:51 编辑 ]

论坛徽章:
0
5 [报告]
发表于 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 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-06-19 15:58 |只看该作者
谢谢楼上的,但是怎样还是会出现一个对话框,有没有方法不要这个对话框,直接就下载了?

论坛徽章:
0
7 [报告]
发表于 2006-06-20 12:14 |只看该作者
你提问要求直接返回文件。

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

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

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

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

请多参考一下http协议方面的内容。

论坛徽章:
0
8 [报告]
发表于 2006-06-20 17:41 |只看该作者
这个只能返回一个href,如果用代码来实现的话,是否可以让客户端直接获得整个文件的buffer,然后保存到特定的目录?
现在的问题是,c语言只能通过printf将文件的buffer返回给apache,但是还不一定能显示出来,中间出现了传送的错误,apache如何应对,都是未知的,这样的未知会不会导致数据的正确性

论坛徽章:
0
9 [报告]
发表于 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


不多说了,你自己多调试把。

论坛徽章:
0
10 [报告]
发表于 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!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP