2012-03-15 4 views
3

Я создаю страницу, где пользователи могут загружать/загружать pdf-файлы, которые хранятся в базе данных mysql, проблема в том, что при загрузке файла он поврежден/поврежденПочему файлы PDF, хранящиеся в базе данных mysql, повреждены или повреждены при загрузке?

NP: данные файла, сохраненного как blob in базы данных.

Ниже мой код:

 // Gather all required data 
     $name = $dbLink->real_escape_string($_FILES['uploaded_file']['name']); 
     $mime = $dbLink->real_escape_string($_FILES['uploaded_file']['type']); 
     $data = $dbLink->real_escape_string(file_get_contents($_FILES   ['uploaded_file']['tmp_name'])); 
     $size = intval($_FILES['uploaded_file']['size']); 

     // Create the SQL query 
     $query = " 
      INSERT INTO `file` (
       `name`, `mime`, `size`, `data`, `created` 
      ) 
      VALUES (
       '{$name}', '{$mime}', {$size}, '{$data}', NOW() 
      )"; 

     // Execute the query 
     $result = $dbLink->query($query); 

     // Check if it was successfull 
     if($result) { 
      echo 'Success! Your file was successfully added!'; 
     } 
     else { 
      echo 'Error! Failed to insert the file' 
       . "<pre>{$dbLink->error}</pre>"; 
     } 
    } 
    else { 
     echo 'An error accured while the file was being uploaded. ' 
      . 'Error code: '. intval($_FILES['uploaded_file']['error']); 
    } 

    // Close the mysql connection 
    $dbLink->close(); 
} 
else { 
    echo 'Error! A file was not sent!'; 
} 

download code: 
// Fetch the file information 
     $query = " 
      SELECT `mime`, `name`, `size`, `data` 
      FROM `file` 
      WHERE `id` = {$id}"; 
     $result = $dbLink->query($query); 

     if($result) { 
      // Make sure the result is valid 
      if($result->num_rows == 1) { 
      // Get the row 
       $row = mysqli_fetch_assoc($result); 

       // Print headers 
       //header('Content-Type: application/pdf'); 
       header("Content-Type: application/force-download"); 
       header("Pragma: public"); 
       header("Content-Description: File Transfer"); 
       header("Content-Type: ".$row['mime']); 
       header("Content-Length: ".$row['size']); 
       header("Content-Disposition: attachment; filename=".$row['name']); 
       header("Content-Transfer-Encoding: binary"); 
       header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
       // Print data 
       @readfile($row['data']); 
      } 
      else { 
       echo 'Error! No file exists with that ID.'; 
      } 

      // Free the mysqli resources 
      @mysqli_free_result($result); 
     } 
     else { 
      echo "Error! Query failed: <pre>{$dbLink->error}</pre>"; 
     } 
     @mysqli_close($dbLink); 
    } 
} 
else { 
    echo 'Error! No ID was passed.'; 
} 
+1

Плохая идея сохранить содержимое файла в базе данных, см. Http://stackoverflow.com/questions/3748/storing-images-in-db-yea-or-nay –

+1

@ Bubby4j это школьный проект, поэтому я у вас нет выбора: S –

+0

Сохранить как капля? – EGHDK

ответ

2

Не так. Мысли тоже не так. У вас всегда есть выбор, расскажите своему учителю, что в этом подходе нет никакой ценности. Почему бы не сохранить jpg в базе данных mysql? Потому что есть лучший способ - сохранить ссылку в базе данных, сохранить .jpg в Интернете. То же самое с PDF. Если вы должны ознакомиться, посмотрите, как веб-редакторы, такие как ckedit, хранят данные (другой неправильный подход.), А также посмотрите на dompdf code.google.com/p/dompdf/, чтобы понять, что нарушает формат PDF.

Почему mysqli - плохая идея? mySql - это то, что есть. mySql пытается сделать это чем-то другим, что лучше сделать с другими методами, иначе mysql сделает это.

Смежные вопросы