Отображение .pdf файла в браузере с PHP in Laravel 7 с использованием RESTful Controller - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над проектом laravel, и внутри проекта я сохраняю файлы .pdf в моем локальном phpmyadmin и извлекаю их для отображения в браузере.

Я вижу некоторые приложения, но они ' сохраняя файлы .pdf локально при загрузке в БД. И тогда это становится так легко отобразить с помощью <img src="">, но я не хочу использовать это.

Это мои маршруты;

Route::get('/users/{user}/posts', 'PostController@index');
Route::get('/posts/create', 'PostController@create');
Route::post('/posts', 'PostController@store');

И индексная функция;

public function index(User $user, Post $posts)
    {
        $posts = DB::table('posts')
                        ->where('userId', '=', $user->id)
                        ->get();

        return view('post.index', compact('posts'));
    }

Я могу загружать и хранить .pdf файлы, которые в порядке, но не могут отображаться в браузере. Поэтому я хочу получить запись с индексной функцией в PostController (что уже сделано) и отобразить файл .pdf в файле index.blade. php, который поступает из базы данных. как это: http://localhost/test.pdf Когда я отображаю его в браузере, я вижу только его имя. Как я могу прочитать файл, который я получил от db?

Спасибо за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Прежде всего, по моему мнению, вы должны хранить файлы в системе хранения laravel, а не в базе данных.

Но если Вы хотите сделать это с базой данных. Вот пример для вывода файла, который хранится в поле BLOB-объекта базы данных (например, в поле content таблицы files).

Другой не очень красивый метод - преобразовать файл в base64 строку и сохранить в текстовом поле, подробнее здесь .

Схема для таблицы 'db_files'

field     | type
----------|-------------
id        | BIGINT
name      | VARCHAR(255)
content   | BLOB
mime_type | VARCHAR(255)

Маршруты

Route::get('/files/{id}', 'FileController@show')->name('file.show');

DbFile Модель

use Illuminate\Database\Eloquent\Model;

class DbFile extends Model {
    // ...
}

FileController

public function show($id) {
    $dbFile = DbFile::firstOrFail($id);

    // the $dbFile->mime_type should be 'application/pdf' for pdf files
    // the $dbFile->name should be in this schema 'document.pdf'
    return response($dbFile->content)
        ->withHeaders([
            'Content-type: ' . $dbFile->mime_type,
            'Content-Disposition: attachment; filename=' . $dbFile->name
        ]);
}

Просмотр

<a href="{{ route('file.show', ['id' => 1]) }}" target="_blank">Show Document</a>

Я не могу сейчас проверить код. Дайте мне знать, если что-то пойдет не так.

0 голосов
/ 29 апреля 2020

У меня есть способ решить эту проблему путем изменения расширения файла с pdf на pdfz или любого другого расширения и использования этого кода

$realPath="path file with pdfz extension";

                 if(file_exists($realPath)){
                   $realPath=str_replace(".pdf",".pdfz",$realPath);
                $file =$realPath;
    $filename = $realPath;
    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="' . $filename . '"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file));
    header('Accept-Ranges: bytes');
    @readfile($file);
    exit;
               }else{
    echo "$realPath:No File Exist";

               }

с целью изменения расширение защита от принудительной загрузки IDM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...