【问题标题】:file downloaded from mysql database using php is changed使用php从mysql数据库下载的文件被更改
【发布时间】:2012-11-04 19:57:24
【问题描述】:

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

“你好”

就可以了..当我下载它时,test.txt变成了

字符串 'sfasfsafasfsaf' (length=14) sfasfsfasfsaf

不知道,怎么了..

这是我下载文件的代码:

<?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)";

这里到底出了什么问题??

【问题讨论】:

    标签: php mysql file file-upload download


    【解决方案1】:

    您正在肆无忌惮地将二进制数据塞入您的数据库,甚至没有proper SQL escaping 的味道。你期望会发生什么?这个简短的代码示例充满了严重 SQL 注入错误,我希望它没有部署在公共互联网上。

    为了您自己的安全,您应该立即停止使用陈旧、陈旧、已弃用的mysql_query 界面,并花一点时间将您的查询切换到 PDO。

    如果您使用占位符,就不会遇到这样的问题。

    您看到的可能是您在输出正确内容之前的虚假var_dump 语句的结果。

    【讨论】:

    • 但无论如何,谢谢,我想通了..我之前正在做单页提交,这就是为什么我下载原始文件时更改了它..
    • 请注意您的 SQL 注入错误。你真的,真的需要至少对输入查询的任何和所有值使用mysql_real_escape_string
    【解决方案2】:

    如果上传文件没有问题,请试试这个。 您可以在插入数据库时​​将二进制数据编码为 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;
      }
    

    ?>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多