PHP强制下载jpg - 查看器说文件已损坏

时间:2014-03-16 23:17:03

标签: php http-headers

我只是有一点时间用这个,我用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();
}

有什么建议吗?

3 个答案:

答案 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 的开头,而不是末尾。