簡體   English   中英

將PHP文件上傳到MySQL mediumblob中的錯誤

[英]Bug with PHP file upload into MySQL mediumblob

我有一個腳本,旨在允許用戶上傳DOC,DOCX,PDF和TXT類型的文件。 確實會上傳文件,盡管沒有換行符。 因此,例如,這樣的TXT文件:

//////////
THIS IS A TEXT FILE
//////////

下載回為:

//////////THIS IS A TEXT FILE//////////

現在,這不是文本文件的“大”問題,但是這種換行中斷完全破壞了PDF,DOC和DOCX類型。

同樣,在記事本中查看的PDF最初如下所示:

%PDF-1.5
%µµµµ
1 0 obj
<</Type/Catalog/Pages 2 0 R/Lang(en-US) /StructTreeRoot 10 0 R/MarkInfo<</Marked true>>>>
endobj
2 0 obj
....

但是,在上載然后下載后,它看起來像一個長字符串,其中有些字符丟失了:

%PDF-1.5%µµµµ1 0 obj<>>>endobj2 0 obj

因此,在Adobe PDF Reader中打開文件時,它表示文件已損壞。


這是我用來上傳文件的PHP腳本的摘錄:

$_POST['request_id'] = $_POST['rid'];
    $tmpName = $_FILES['exam_file']['tmp_name'];
    $_POST['name'] = $_FILES['exam_file']['name'];
    $_POST['type'] = $_FILES['exam_file']['type'];
    $_POST['size'] = $_FILES['exam_file']['size'];
    //File types allowed are PDF, DOC, DOCX, TXT
    if ( ( $_POST['type'] == "application/pdf") || ($_POST['type'] == "application/msword") || ($_POST['type'] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document") || ($_POST['type'] == "text/plain") ){
        $fp = fopen($tmpName, 'r');
        $content = fread($fp, filesize($tmpName));
        fclose($fp);
        $file_id = $model -> addFiles($_POST, $content);    
    }

$ model中的函數addFiles()如下:

function addFiles($data, $file){
    $table = 'faculty_files';
    $data = parent::clean($data);
    $keys = array('request_id', 'name', 'type', 'size', 'content');
    $data = parent::cleanAndPick( $keys, $data );
    $data['content'] = $file;
    $data['faculty_user_id'] = $_SESSION['user_details']['id'];
    $data['inserted_on'] = date('Y-m-d H:i:s');
    parent::insert( $table, $data );
    return mysql_insert_id();
}

parent::insert()僅獲取所有相關細節,例如表名和字段,並將其放入SQL語句中。

這是函數parent::clean()盡管沒有通過$file運行它:

public function clean($data = NULL){
  $data = str_replace("\n", "", $data);
  $data = str_replace("\r", "", $data);
  $data = stripslashes($data);
  return mysql_real_escape_string($data);
}

函數parent::cleanAndPick()

public function cleanAndPick($keys, $data = NULL) {

    $clean = array();
    foreach ($keys as $key) {
        if (array_key_exists($key, $data))
            $clean[$key] = $this -> clean($data[$key]);
    }
    return $clean;

}

函數parent::insert()

protected function insert($table, $data ) {

    //Build sql
    $data = $this -> clean($data);
    $sql = "INSERT INTO " . $this -> clean($table);
    $sql .= " (" . implode(",", array_keys($data)) . ") VALUES (";
    foreach ($data as $value)
        $sql .= ($value == NULL ? "NULL," : "'" . $value . "',");
    $sql = substr($sql, 0, -1) . ")";
    return $this -> query($sql);

}

這是我用來下載文件的PHP腳本:

$file = $model -> retrieveFile($_POST['fid']);
header("Content-length: " . $file[0]['size'] . "");
header("Content-type: " . $file[0]['type'] . "");
header("Content-Disposition:attachment; filename=" . $file[0]['name'] . "");
print $file[0]['content'];

我不知道是什么引起了這個問題。 我將不勝感激!

編輯:有人在PHP論壇上遇到了類似的問題。 摘錄:

我一直嘗試在Linux服務器上上傳和讀取Mac OS文件失敗。 許多記錄僅使用以下內容顯示一個大記錄:

<?php $fhandle = fopen($file, 'r'); ?>    or  <?php $fhandle =
> fopen($file, 'rb'); ?> 

但是,它確實可以這種方式工作:

> <?php  ini_set('auto_detect_line_endings', TRUE);  $fhandle =
> fopen($file, 'r');  ?>

我確實嘗試過,但對我沒有用。

使用fopen($tmpName, 'rb'); 如果您不想對其內容進行任何更改。

然后這個:

protected function insert($table, $data ) {
  //Build sql
  $data = $this -> clean($data); //<---- here......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM