在Laravel 7中使用RESTful Controller在浏览器中显示.pdf文件.

问题描述 投票:0回答:1

我正在做一个laravel项目,在项目中我存储了以下内容 .pdf 文件到我的本地phpmyadmin,然后检索回来在浏览器中显示。

我看到一些应用程序,但它们保存的是 .pdf 文件在本地,同时上传到DB。然后,它变得如此容易显示与 <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文件中的文件,它来自db.这样。http://localhost/test.pdf当我在浏览器中显示这个文件时 我只能看到它的名字 我怎样才能读取从db.like.得到的文件呢?db

谢谢您的回答。

php laravel pdf blob
1个回答
0
投票

首先,在我看来,你应该将文件存储到 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
投票

我有一个方法可以解决这个问题,把文件的扩展名从 pdfpdfz 或任何其他扩展,并使用此代码

$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

© www.soinside.com 2019 - 2024. All rights reserved.