【问题标题】:How can I display output to a web browser AND push a file for download?如何将输出显示到 Web 浏览器并推送文件以供下载?
【发布时间】:2010-10-06 14:10:58
【问题描述】:

我知道如何将输出显示到 Web 浏览器(显然),我还知道如何通过设置 Content-Disposition 和 Content-Type 标头然后推送文件数据来推送文件以供客户端下载。但我想两者都做,类似于有多少下载页面工作(“您的文件下载将立即开始”)。

使用什么技术来实现这一点?我正在考虑使用 META HTTP 刷新,但事情是这样的......网页实际上正在做一些相当复杂的处理,我想向用户显示处理结果并将结果以文件形式推送给用户但只执行一次处理。如果可能,我想避免 HTTP 刷新。有没有办法通过一个页面请求来完成这两个?还是我必须将文件写入服务器,然后在 HTTP 刷新请求的第二个页面请求中提供它?

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    在您的输出中使用 iframe,该 iframe 将包含指向您要下载的文件的链接。

    输出样本:

    <div>Foo</div>
    <iframe width="0px" height="0px" src="path/to/file"></iframe>
    

    您不能使用 HTTP 协议说“此部分用于显示,而该部分用于下载”。

    但是,您可以将文件“缓存”在临时目录中,该目录无法从公共视图(文档根目录之外)访问,然后通过 PHP 输出该文档内容(例如:file_get_contents 或其他内容)。然后可以通过 API 清理该临时文件夹,该 API 可以简单地扫描该文件夹并删除任何早于特定时间的文件(请参阅 filemtime()

    每次创建新文件时都可以进行清理,从而将文件夹的大小保持在合理的值。

    【讨论】:

    • 好的,我知道它是如何工作的......但这也会向服务器创建第二个请求,我必须缓存文件。我想我应该说该文件不是真正的文件 - 它是来自 SQL 查询的数据。如果不需要,我不想将文件保存到磁盘,我也不想执行 SQL 查询两次。有没有办法在不第二次访问服务器的情况下同时向用户显示内容?
    • 谢谢!我找到了另一种我更满意的缓存方式——我只是将文件保存在 Session 变量中,然后使用 IFRAME 重定向,告诉页面只发送来自 session 变量的数据,然后删除 session 变量。像冠军一样工作!
    • 是的 :) 也可以!只要你的文件/数据不是太大,在这种情况下你就会突破内存使用限制(因为每次请求的会话数据都完全加载到内存中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多