我只是有一点时间用这个,我用php强制下载文件从我的数据库到ole'desktop,下载部分很好,然后当我去打开文件(在查看器中如果它是jpg)应用程序告诉我文件已损坏
这是html
<form action="view_file.php" method="post" name="downloadform">
<input name="file_name" type="hidden" value=<?php echo $row['file_path'];?>>
<input name="file_type" type="hidden" value=<?php echo $row['file_type'];?>>
<button type="submit" value="Secure Download" class="col-xs-12 col-sm-4 col-md-4 col-lg-4 btn btn-default pull-left view_file"><span class="glyphicon glyphicon-cloud-download"></span> Secure Download</button>
</form>
这是我的php片段 //清理输出缓冲区 ob_clean();
//If statement gets everything started
if(isset($_POST['file_name'])){
//Grab global variables from the HTML form
$file = $_POST['file_name'];
$file_type2 = $_POST['file_type'];
//Grab last item in array then explode to only grab the file name
$filename = array_pop(explode('/', $file));
//Grab file type from global variables in HTML form
header("Content-type: ".$file_type2."");
////Grab file path from global variables in HTML form
header('Content-Disposition: attachment; filename="'.$filename.'"');
readfile($file);
exit();
}
有什么建议吗?
答案 0 :(得分:0)
我认为您的问题可能是您尝试在不完整的文件名上读取文件。试试
$fullfilename = $filename.'.'.$file_type2;
readfile($fullfilename);
看看会发生什么。此外,像其他人一样说...用文本编辑器打开文件并阅读错误。您可能需要打开错误报告。你用
做到了ini_set('display_startup_errors',1);
ini_set('display_errors',1);
error_reporting(-1);
答案 1 :(得分:0)
作为错误消息&#34;只应通过引用传递变量&#34;说,你给一个使用参考传递的参数的函数赋予一个常量值。
我认为问题在于:
$filename = array_pop(explode('/', $file));
array_pop first param通过引用传递,因为在此过程中修改了数组。您应该使用临时变量:
$filepathArray = explode('/', $file);
$filename = array_pop($filepathArray);
甚至更好,使用最适合您想要做的基本名称功能:
$filename = basename($file);
答案 2 :(得分:0)
我想我遇到了类似的问题。
这是因为 readfile() 有一种 4096 字节的缓冲区。
这意味着当您的页面通过点击提交重新加载时
在您的 readfile() 进入此缓冲区之前写入的任何内容,在开始下载之前。
但是这个“任何”大于 4096 字节,超出部分会被要下载的文件卡住,损坏它。
尝试将 snpiset 放在 view_file.php 的开头,而不是末尾。