我正在通过PHP使用以下输出动态提供Zip和PDF文件:
header('Content-Disposition: attachment; filename="'.$project->name .'.zip"');
echo($zipfile->zl_pack());
我在APACHE日志中找不到对这些下载的任何引用。是否由于动态而没有记录?
我是否需要将文件实际写入网络服务器,然后提供结果以使其记录或我遗失了什么?
干杯, Niggles
答案 0 :(得分:0)
正确。 httpd不会查看用于记录的传出标头。 error_log()
会向httpd的错误日志发送消息,但是无法在访问日志中添加内容。
答案 1 :(得分:0)
应记录对生成该标头的PHP程序的请求。内容处置标题中提到的文件名不会是。
我相信mod _ perl would allow you to add custom logging,我不知道mod_php是否提供了类似的功能。
答案 2 :(得分:0)
作为一种解决方法,你可以使用mod_rewrite来记录* .zip文件并仍然通过PHP提供它而不实际将其写入文件系统,客户端将不得不发送两个请求。
1)更改当前脚本,使其不生成文件,而是将文件创建所需的参数放入会话中;而不是当前的标题和文件内容,而是放置header('Location: '.$project->name .'.zip');
2)这会导致第二个请求。由于请求的文件尚不存在,您可以使用mod_rewrite将对* .zip文件的请求更改为从会话中读取参数的相同或其他PHP脚本,并生成文件就像您正在执行它一样现在。如果你使用相同的PHP脚本,你还可以让mod_rewrite在请求中添加一些参数,如“?action = produceFile”,然后在脚本中测试该参数。
通过这种方式,您可以在Apache日志中拥有两个不错的条目,而无需在物理上保存文件(以后可能会将其删除)。
答案 3 :(得分:0)
仅供参考我找到了一个非常好的解决方法。
部分问题是我们想要强制“另存为”对话,因为许多用户对文件保存位置感到困惑。所以这就是我去
的原因Content-Disposition : attachment
方法
仍然调用对话框的更好方法是将其添加到.htaccess
<Files *.zip>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
将Zip写入文件服务器并将页面重定向到zip。
当然我每晚必须清理,但它会被记录下来并且仍然会强制他们选择下载文件的位置(除了Safari之外几乎所有东西都有)。
干杯, Niggles