1

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

“你好”

就可以了..当我下载它时,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)";

这里到底有什么问题?

4

2 回答 2

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;
  }

?>

于 2012-11-16T16:11:57.853 回答
1

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

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

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

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

于 2012-11-16T04:58:47.990 回答