Отображение PDF-файлов, хранящихся в базе данных MySQL PHP - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь отобразить файлы PDF, хранящиеся в базе данных mysql, в браузере, когда пользователь запрашивает.

Структура таблицы MySQL:

CREATE TABLE `file` (
`id` Int Unsigned Not Null Auto_Increment,
`name` VarChar(255) Not Null Default 'Untitled.txt',
`mime` VarChar(50) Not Null Default 'text/plain',
`size` BigInt Unsigned Not Null Default 0,
`data` MediumBlob Not Null,
`created` DateTime Not Null,
PRIMARY KEY (`id`)
)

php код:

$query = "
            SELECT `type`, `name`, `size`, `data`, `mime`
            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('Accept-Ranges: bytes');
                header('Content-Transfer-Encoding: binary');
                header("Content-Type: ".$row['mime']);
                header("Content-Length: ".$row['size']);
                header("Content-Disposition: inline; filename=".$row['name']);
                echo $row['data'];
            }
        }

код для сохранения файла в базе данных:

<code>if(isset($_FILES['uploaded_file'])) {
    // Make sure the file was sent without errors
    if($_FILES['uploaded_file']['error'] == 0) {
        // Connect to the database
        $dbLink = new mysqli('localhost', 'REDACTED',"REDACTED", 'pdfs');
        if(mysqli_connect_errno()) {
            die("MySQL connection failed: ".mysqli_connect_error());
        }

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

        // Create the SQL query
        $query = "
            INSERT INTO `file` (
                `name`, `type`, `size`, `data`, `created`
            )
            VALUES (
                '{$name}', '{$type}', {$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}
";}

однако, когда я пытаюсь просмотреть PDF, Adobe Reader начинает загрузку, а затем я получаю это сообщение об ошибке:

файл поврежден и не может быть восстановлен.я делаю что-то не так?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Честно говоря, мне совсем не нравится этот способ.

ПОЦЕЛУЙ

Делайте это коротким и простым

Что бы вы ни пытались сделать, есть лучший способ сделать это.

  1. Если безопасностьпроблема в том, что у вас есть .htaccess и права доступа
  2. Если проблема с обработкой файлов - у вас PHP.
  3. Если защищенная загрузка является проблемой, то снова с комбинацией PHP и обработкой его сеанса,Вы можете сделать это.
  4. Если проблема заключается в просмотре браузера, который у вас есть.
  5. Если вы хотите принудительно загрузить файл, тогда достаточно тегов PHP header.
0 голосов
/ 21 марта 2012

Call die ();после echo $ row ['data'];чтобы убедиться, что никакой другой вывод не добавляется после ваших данных.Не уверен, что это проблема, но это исключит ее.

...