当我尝试查看以 bin 格式上传到数据库的 pdf 文档时,它出现空白?

when I try to view my pdf document uploaded to a database in bin format it comes up blank?

提问人:Josue Velasquez 提问时间:9/30/2023 最后编辑:Josue Velasquez 更新时间:10/1/2023 访问量:63

问:

我正在开发一个使用 php 和 mysql 的网站,我将 pdf 文档以 bin 格式保存在数据库中。

enter image description here

为了能够在查看器中看到模态窗口中的 pdf,我有这个 js 控制器:

// Ver el documento
function documento(id_aval) {
    // Crea un objeto que contenga el id_aval
    var dataToSend = { id_aval: id_aval };

    // Realiza una petición AJAX para obtener el documento en formato binario desde el servidor
    $.post("../controllers/Utils/endorsement.php?pc=obtener_documento", dataToSend, function (data) {

        console.log(data)

        // Muestra el PDF en el visor
        mostrarPDF(data);


    })
    .fail(function(error) {
        console.error("Error al obtener el documento:", error);
    });
}

// Función para mostrar el PDF en el visor
function mostrarPDF(data) {
    // Abre el modal
    abrir_view_document();

    // Decodifica la cadena base64 directamente en un Uint8Array
    var decodedPdfData = new Uint8Array([...data].map(char => char.charCodeAt(0)));

    // Convierte los datos a base64 nuevamente
    var base64Data = btoa(String.fromCharCode.apply(null, decodedPdfData));

    console.log("Base64 Data:", base64Data);

    // Actualiza el contenido del visor de PDF dentro del modal
    var viewer = document.getElementById('ver_documento_contenedor');
    viewer.innerHTML = '<iframe src="data:application/pdf;base64,' + base64Data + '" width="800px" height="500px"></iframe>';

}

附件是日志的屏幕截图,显示我正确地获得了 bin 文件和 base64 转换。

enter image description here enter image description here

我也有这个php控制器:

    // Obtener el documento en formato binario
    case "obtener_documento":
        if (!empty($_POST["id_aval"])) {
            $id_aval = $_POST["id_aval"];
            $documento = $aval->get_documento($id_aval);

            // Devolver el documento en formato binario
            header('Content-type: application/pdf');
            header('Content-Disposition: inline; filename="documento.pdf"');
            echo $documento;
            exit;
        }
        break;

而这个PHP模型:

    // Obtener el documento en formato binario
    public function get_documento($id_aval)
    {
        $conectar = parent::conexion();

        $sql = "SELECT documento_avalOrganizacion FROM pc_aval_organizacion WHERE id_aval = ?";
        $stmt = $conectar->prepare($sql);
        $stmt->bindValue(1, $id_aval);
        $stmt->execute();

        $resultado = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($resultado) {
            return $resultado['documento_avalOrganizacion'];
        } else {
            return false;
        }
    }

这是我得到的结果......文档为空。

enter image description here

两者都没有给我控制台错误或日志,并且 bin 格式的文档本身没有损坏或任何东西,实际上,如果我下载它并将扩展名从 .bin 更改为 .pdf,您可以完美地看到内容。

我不知道问题是否是因为我的页面带有友好的路由,因为我试图使用文件的 url 来做 pdf 查看器,但总是把我送到 404,因为它是一个未定义的路径。有了一切,我还留下了我的友好路线代码,以防万一......

.htaccess域名

# Permitir el acceso directo a recursos (CSS, JS, imágenes, etc.)
RewriteRule ^(assets/|favicon\.ico) - [L]

# Permitir el acceso directo a archivos PDF
RewriteRule \.pdf$ - [L]

# Redirigir todas las solicitudes a index.php, excepto para recursos
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?uri=$1 [QSA,L]

RewriteEngine On
RewriteBase /Plataforma/

Options -Indexes
ErrorDocument 405 /Plataforma/index.php
ErrorDocument 404 /Plataforma/index.php
ErrorDocument 403 /Plataforma/index.php
ErrorDocument 402 /Plataforma/index.php
ErrorDocument 401 /Plataforma/index.php
ErrorDocument 400 /Plataforma/index.php

# log PHP errors to a file
php_flag log_errors on
php_value error_reporting 32767
php_value error_log "error_log.txt"

索引.php

<?php
// Conexión BDD
require_once 'configs/connections/connection.php';
// Temporizador de la session
require_once 'configs/global/session_timeout.php';

// Obtener la URL solicitada
$folderPath = dirname($_SERVER['SCRIPT_NAME']);
$request_uri = $_SERVER['REQUEST_URI'];             //Esta ruta es para produccion
$url = substr($request_uri, strlen($folderPath));   //Esta ruta es para local


// Incluir archivos de rutas específicos
require_once 'configs/routes/user.php';
require_once 'configs/routes/admin.php';
require_once 'configs/routes/control.php';


// Definir un array de rutas amigables
$routes = [];

// Agregar las rutas de usuario al array $routes
foreach ($userRoutes as $key => $value) {
    $routes[$key] = $value;
}

// Agregar las rutas de administrador al array $routes
foreach ($adminRoutes as $key => $value) {
    $routes[$key] = $value;
}

// Agregar las rutas de control al array $routes
foreach ($controlRoutes as $key => $value) {
    $routes[$key] = $value;
}


// Comprobar si la ruta solicitada está en el array
if (array_key_exists($url, $routes) && strpos($url, '.pdf') === false && !preg_match('/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/', $url)) {
    // Incluir la vista correspondiente
    include $routes[$url];
} else {
    // Ruta no encontrada, mostrar la página de error 404
    include 'views/Error/404/index.php';
}

芸香

<?php
// Variables
$Home_admin         = 'Admin';
$Login_admin        = 'administrador';
$Users              = 'Admin/usuarios';
$User_massive       = 'Admin/usuarios/masivo';
$Organizations      = 'Admin/organizaciones';

$Countries          = 'Admin/paises';
$Type_organization  = 'Admin/organizaciones/tipos';
$Categories         = 'Admin/categorias';
$Type_course        = 'Admin/cursos/tipos';

$Courses            = 'Admin/cursos';
$Students           = 'Admin/cursos/alumnos';
$Endorsements       = 'Admin/avales';
$Certificates       = 'Admin/plantillas/certificados';
$Constancias        = 'Admin/plantillas/constancias';

$Certify            = 'Admin/certificar';


// Designacion de rutas
$adminRoutes = [
    '/' . $Home_admin           => 'views/Admin/Home/index.php',
    '/' . $Login_admin          => 'views/Auth/Admin/index.php',
    '/' . $Users                => 'views/Admin/Utils/Users/index.php',
    '/' . $User_massive         => 'views/Admin/Utils/Users/Massive/index.php',
    '/' . $Organizations        => 'views/Admin/Utils/Organizations/index.php',
    '/' . $Countries            => 'views/Admin/Utils/Countries/index.php',
    '/' . $Type_organization    => 'views/Admin/Utils/Type_organizations/index.php',
    '/' . $Categories           => 'views/Admin/Utils/Categories/index.php',
    '/' . $Type_course          => 'views/Admin/Utils/Type_course/index.php',
    '/' . $Courses              => 'views/Admin/Utils/Course/index.php',
    '/' . $Students             => 'views/Admin/Utils/Course/Student/index.php',
    '/' . $Endorsements         => 'views/Admin/Utils/Endorsement/index.php',
    '/' . $Certificates         => 'views/Admin/Utils/Templates/Certificates/index.php',
    '/' . $Constancias          => 'views/Admin/Utils/Templates/Constancias/index.php',
    '/' . $Certify              => 'views/Admin/Utils/Certify/index.php',
];

如果你能帮我看看我做错了什么,我将不胜感激,我已经做了很长时间了,我找不到解决方案。

php mysql pdf 模型-视图-控制器 pdo

评论

0赞 Olivier 9/30/2023
您真的需要使用 POST 方法吗?您可以使用 GET 并将 指向生成 PDF 的 URL。<iframe>
1赞 ADyson 9/30/2023
根据如何询问,请以文本形式发布代码,而不是图像。图像对于屏幕截图很有用
1赞 Josue Velasquez 10/1/2023
感谢您@ADyson的回答。我已经编辑了这个问题,我很抱歉......
0赞 Josue Velasquez 10/1/2023
@Oliver如果我需要发送 post 方法,get 不会为我获取数据
0赞 Josue Velasquez 10/1/2023
我通过将文件直接上传到数据库中的 base64 来解决这个问题,我猜 bin 到 base64 的转换出了点问题,所以我就这样留着,谢谢。

答: 暂无答案