【问题标题】:Telling the browser to open or download a file in Codeigniter告诉浏览器在 Codeigniter 中打开或下载文件
【发布时间】:2011-06-27 08:27:15
【问题描述】:

在 Codeigniter 中,我们可以使用下载助手中的force_download($file_name,$data) 函数来强制浏览器下载文件。

但这不是我需要的,我希望Codeigniter响应一个带有文件对应的MIME类型的http头,这样浏览器可能会或可能不会下载文件,这取决于是否有注册的应用程序对于客户端机器上的那种 MIME 类型(如果有,该应用程序将打开该文件)。

有没有办法用 Codeigniter 做到这一点?

非常感谢大家。

【问题讨论】:

    标签: php codeigniter download mime-types codeigniter-2


    【解决方案1】:

    不,你不能用 Codeigniter 做到这一点。

    一般来说,像PHP这样的服务器端技术,你只能向客户端发送内容,不能直接与客户端交互。客户可以根据您发送给他们的任何内容来做他们想做的事。即使使用 javascript 之类的客户端工具,(谢天谢地)您也只能与客户端计算机进行有限的交互。您想要做的是允许网站在访问时(自动)下载一个软件,并在客户端机器上执行它......

    这就是所谓的恶意软件...(由ActiveX 的制造商提供给您)

    以上是直接回应

    "...这样浏览器可能会或可能不会下载文件,具体取决于客户端计算机上是否有为该 MIME 类型注册的应用程序(如果有,该应用程序将打开该文件)。

    更新

    您可以通过普通的 php 标头操作来设置 mime 类型。下面的例子直接取自phpheader() documentation作为第一个例子。

    <?php
    // We'll be outputting a PDF
    header('Content-type: application/pdf');
    
    // It will be called downloaded.pdf
    header('Content-Disposition: attachment; filename="downloaded.pdf"');
    
    // The PDF source is in original.pdf
    readfile('original.pdf');
    ?>
    

    【讨论】:

    • 不是真正的恶意软件,用户上传了一些文件,我把它们放在了 webroot 之外的地方。用户只能下载他/她上传的文件。所以我在 Codeigniter 中创建了一个路由,并在控制器的相应函数中创建了一个路由,只有当他们登录(经过身份验证)时,我才为他们提供文件。我正在使用 file_get_contents 读取文件,现在我需要一个类似 force_download 的函数,它告诉浏览器下载/打开文件,就好像文件是从 webroot 提供的一样。
    • 所以我想知道CI是否提供了这样一个功能,将文件发送到客户端浏览器(在http响应头中为我指定正确的MIME)并让浏览器决定做什么用它。 force_download 的问题是,它强制浏览器使用通常未在客户端计算机上的任何应用程序注册的 MIME 类型下载文件(这不是我想要的)。
    • 我在 Codeigniter 的 application/config/mimes.php 中建立了 MIME 映射数组,结合你的 PHP 代码,应该很容易写出一个完全满足我需要的函数。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2019-03-08
    相关资源
    最近更新 更多