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 に答える