使用php从mysql数据库下载的文件已更改

时间:2012-11-16 04:55:55

标签: php mysql file file-upload download

我能够将文件上传到mysql但是当我下载它时,内容会发生变化..例如我有test.txt和

  

“你好”

on ..当我下载它时,test.txt变为

  

< pre class ='xdebug-var-dump'dir ='ltr'> string'sfasfsafasfsaf'(length = 14)   sfasfsafasfsaf

不确定,出了什么问题......

这是我下载文件的代码:

<?php include("class_lib.php"); 
        $db = new database();
        $db->connect();
    if(isset($_GET["file_id"])){
                    $file_id = $_GET["file_id"];

                    $query = "SELECT filename, filetype, filesize, bin_data " .
                                "FROM file_tbl WHERE id = '$file_id'";

                    $result = mysql_query($query) or die('Error, query failed' . mysql_error());
                    list($filename, $filetype, $filesize, $bin_data) = mysql_fetch_array($result);
                     var_dump($bin_data);  

                    header("Content-length: $filesize");
                    header("Content-type: $filetype");
                    header("Content-Disposition: attachment; filename=$filename");
                    echo $bin_data;

            }
?>

对于图像也是如此,它下载但是没有图像..它只显示"no preview available" ..这是我上面的下载脚本吗? 或者这个上传脚本我有:

$fileid = (string) ($lastemp_id + 1);
            $fileName = basename($_FILES['binFile']['name']);
            $extension = pathinfo($fileName, PATHINFO_EXTENSION);
            $fileName .= "_fileid_" . $fileid;
        $fileName = $fileName.".".$extension;
        $tmpName  = $_FILES['binFile']['tmp_name'];
        $fileSize = $_FILES['binFile']['size'];
        $fileType = $_FILES['binFile']['type'];
        $fileDesc = $_POST["txtDescription"];
        $fp      = fopen($tmpName, 'r');
        $content = fread($fp, filesize($tmpName));
        $content = addslashes($content);
                    fclose($fp);

        if(!get_magic_quotes_gpc()){ $fileName = addslashes($fileName); }     

        if (isset($fileName)) {
            $sql = "INSERT INTO file_tbl ";
            $sql .= "(file_desc, bin_data, filename, filesize, filetype) ";
            $sql .= "VALUES ('$fileDesc', '$content',  ";
            $sql .= "'$fileName', '$fileSize', '$fileType')";
            mysql_query($sql, $db->connection) or die('Error: query failed' . mysql_error()); 
            $message =  "File uploaded.<br>"; var_dump($content);
        }
        else $message = "No file uploaded. (opt)";

这里究竟出了什么问题?

2 个答案:

答案 0 :(得分:1)

你不顾一切地将二进制数据干扰到你的数据库中,甚至没有proper SQL escaping的气味。你期望发生什么?这个简短的代码示例充满了严重 SQL注入错误,我希望它不会在公共互联网上部署。

为了您自己的安全,您应立即停止使用蹩脚,旧的,已弃用的mysql_query界面,并花费少量时间将查询切换为PDO。

如果使用占位符,则不会出现这样的问题。

在您输出正确的内容之前,您所看到的可能是虚假var_dump声明的结果。

答案 1 :(得分:1)

如果上传文件完美无缺,请尝试此操作。 您可以在插入数据库时​​将二进制数据编码为64格式,并在下载之前进行解码。

<?php 
ob_start();     
include("class_lib.php");
$db = new database();
$db->connect();
    if(isset($_GET["file_id"])){
          $file_id = $_GET["file_id"];
          $query = "SELECT filename, filetype, filesize, bin_data " .
                            "FROM file_tbl WHERE id = '$file_id'";

          $result = mysql_query($query) or die('Error, query failed' . mysql_error());
          list($filename, $filetype, $filesize, $bin_data) = mysql_fetch_array($result);
          var_dump($bin_data);  
          ob_end_clean();
          header("Content-length: $filesize");
          header("Content-type: $filetype");
          header("Content-Disposition: attachment; filename=$filename");
          echo $bin_data;
          exit;
  }

&GT;