下载文件

  先不去说关于php下载文件的问题,想先说说我自己对http的理解,只有理解了http的原理,之后再去说下载的问题(无论是用何种语言)应该就会很清楚。

首先必须先去明白什么是浏览器,浏览器只是一个客户端,是遵循http服务的一个应用程序。那么我们在想想http协议是怎么操作的,请求(request)+  响应(response),当用户发起请求的时候,会发送request,请求内容包括2部分,头文件+内容,当服务器接收之后解析文件,然后返回响应response,响应内容也是头文件+内容。无论是何种请求,何种方式,等等,都是这个形式。那么问题来了,他是怎么知道我需要下载一个文件还是打开一个文件?按照http协议的思想,服务器返回头文件+内容,交给浏览器来处理,浏览器会根据头文件的内容,来决定怎们处理你的数据,如果你设置头文件为Content-Disposition","attachment,那么浏览器是不会去解析这个文件,("attachment":附件)会当成附件的形式去处理这个文件。那么我们只需要在头文件加上这个内容,浏览器就不会去打开这个文件,而是去下载文件,这就是下载的道理。其实不只是文件下载,所有的处理,都是根据http协议来定义的,客户端只是http协议的一个封装。

下面是我在网上看到的一篇文章(部分内容)

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)  

        服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

Response.AppendHeader("Content-Disposition","attachment;filename=FileName.txt");

备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

 

** 我要表达的意思,其实不是文件的下载,而是对http协议的理解,当我们去学习一个东西的时候,不能只停留在用的基础之上,我们应该去从多方面去考虑这个事情,去理解他的基本思想。就比如本文所说的http协议,其实简单的说,就只是请求加响应。每次都是头文件+内容的形式,只要遵循http协议的约定,我们就可以根据头文件来处理不同的事情,就会把简单的请求相应的方式变的多元化。

(只是个人理解,如有不妥,欢迎留言,谢谢)

posted @ 2017-07-12 00:02  lsmt  阅读(209)  评论(0编辑  收藏  举报