可能重复:
forcing a file download with php
force download of different files
我正在尝试允许用户从我的网站下载图像。我已经看过很多关于它的文章,我试图使用php文档中的readfile。但我似乎无法让它发挥作用。
这是我尝试设置开始下载的按钮的代码:
<!-- download image button -->
<form class="grid_12" style="text-align: center;" action="../includes/download.php" method="post">
<input type="hidden" name="id" value="<?php echo $photo->id; ?>" />
<input type="hidden" name="img" value="<?php echo $photo->filename; ?>" />
<?php if(isset($_GET['cat'])){?>
<input type="hidden" name="cat" value="<?php echo $_GET['cat']; ?>" />
<?php } ?>
<div id="download"><input type="submit" name="submit" value="Download Photo" /></div>
</form>
这是我在download.php文件中设置的代码(redirect_to只是一个调用header(Location:var)的函数,其中var是你传入的内容。
<?php
require_once('initialize.php');
?>
<?php
header("Content-type: application/force-download; filename=".$_POST['img']);
// Force download of image file specified in URL query string and which
// is in the same directory as this script:
if(!empty($_POST['img']))
{
$file = $_POST['img'];
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
$addy = "../public/photo.php?id=".$_POST['id'];
if(isset($_POST['cat'])){
$addy .= "&cat=".$_POST['cat'];
}
redirect_to($addy);
}
header("HTTP/1.0 404 Not Found");
?>
我在帖子中发送的隐藏变量主要用于重定向,以便在下载开始后将用户带回他们下载的页面。在我的本地主机上,我被重定向到我点击下载按钮的页面。在我的服务器上,我只是被发送到一个空白页面,注册为download.php。我认为这可能与输出缓冲有关,因为我得到一个空白页面。这通常意味着在调用header()函数之前会有某种输出。
如果有人能给我一些关于我在这里做错的一些见解,我将非常感谢,感谢您的阅读。
-Alan
答案 0 :(得分:0)
感谢您的洞察力,我相信这是hakre和GBD指出的组合。我两次调用标题,因为我有一个设置我如何看到一个例子设置它。然后我用php文档中的例子来读取文件......
然后我必须修复图像文件的绝对路径,因为我只发送文件名。再次感谢您的快速帮助,我非常感谢。
**更新
这修复了我在本地主机上的所有内容,但在服务器上它现在需要我到一个充满乱码符号的页面而不是开始下载...我将调查此问题并在找到解决方案时重新发布。< / p>
**修复
首先我必须进入服务器上的php.ini文件并更改allow_url_fopen = On,以便服务器可以使用readfile,fopen等文件方法。然后我还必须在文件上添加输出缓冲,因为那里是如此多的标题调用。在没有输出缓冲的情况下,在建立整个呼叫之前调用了第一个缓冲区。
再次感谢所有帮助,它现在可以在我的本地主机和服务器上运行。