es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La descarga forzada de un archivo docx produce un galimatías.

Estoy trabajando en una aplicación que genera documentos para los usuarios usando PhpWord.

Creé un archivo “firewall.php” para asegurarme de que los usuarios solo puedan ver sus propios archivos.

Los archivos se están generando correctamente y no tengo problemas para verlos desde la carpeta “uploads”. Pero cuando los descargo a través de firewall.php, se están desordenando como esto:

뽐䬃Д ¤憂匎ꕩ䷱ àȀ 牥汳⼮牥汳궒셊̱ႆ 䖘笷�氯⋴⚲㻀遌眗㞙遌땽筃兴ꆬ舽컌㼟�갷ܿ꨷䩹恙햠⡘癃벴辋㭐夰㠜㦐脣旘㑗 ᩑ쩎 顕膄沠ញ柛鏇山ꑐ☻丞ꖔ꧓ᇭ⭶ꑗ畽ꯓ伆㐓ꛚ㨃槫隠�놵❁螂�䱥㯉偎儭Ꚏ쒀揻哚璉ꠊ᧴禡헟蕸뜛ⰽ냝笊狎謎䋁醛埂ᣧ貮⽩擷姘￲䒧천틍▕ꚉ澟睎亻쿶鞍鹼쳦͐䬃Д ¤憂叼뉧ꂿ ;Ā d潣偲潰猯慰瀮硭沝辽櫃〔藷㺅톞죍၊遥䩋졒뚳邮涁疯遮跽⧘鶻鴟䞵䮘ꨙ勶蒍砼횢ʴຍ碿式侢쩬킙褐᪱䈖굾偝ꈈ褽ူ㝢撎ᜩ댝↘簬㖖ꚧᐌលى緯ⶼ鋽઀ⱏ畽隰゠ͷ蠛僼ሯ㏿៪죾 ῷ㔖鹖켱仞ᨮ❵矫㸩㤥ニ 䈴롪┷퀌遊뒫ﶶ︆偋̄᐀Ȁࠀꑡ艓 砋̜偿氝䗎�厈田恅싵髸ᰣ灜뎁㍊摧씿褻耭쑼㘲佼쵙ꁪ⚻辎陃ṹ饒�䏟㰞続蒇U睩阦�ꈋ⁨瀬㷐

Este es mi código para descargar el archivo Docx (firewall.php):

<?php
require_once($_SERVER[‘DOCUMENT_ROOT’] . ‘/app.php’);

$user_id = intval($_SESSION[‘user_id’]);

if ($user_id) {
$file = htmlspecialchars($_GET[‘file’]);
$file_arr = explode(‘/’, $file);
$file_ext = trim(mb_substr($file, -4), ‘.’);
$disposition = ‘inline’;

if (strpos($file_ext, 'docx') !== false) {
    $file_ext = 'vnd.openxmlformats-officedocument.wordprocessingml.document';
    $disposition = 'attachment';
}

// Permitir solo si el user_id es igual al de la ruta del archivo
if (intval($file_arr[1]) == $user_id) {
    $file_path = __DIR__ . "/app/uploads/$file";

    header('Content-Description: File Transfer');
    header('Content-Disposition: ' . $disposition . '; filename="' . $file_arr[2] . '"');
    header('Content-Type: application/' . $file_ext);
    header('Content-Transfer-Encoding: binary');
    header('Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file_path));

    readfile($file_path);
} else {
    echo '403: Prohibido';
}

}

die();

Valores de los parámetros:

$file = ‘usuarios/1/304811Doc02-2021_330.docx’;
Content-Type = ‘application/vnd.openxmlformats-officedocument.wordprocessingml.document’;
$file_path = ‘/var/www/dashboard/app/users/1/304811Doc02-2021_330.docx’;
$disposition = ‘attachment’;

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema de los archivos descargados alterados puede deberse a que las cabeceras se envíen antes del contenido del archivo. En el código proporcionado, se establecen las cabeceras antes de que se envíe el contenido del archivo utilizando la función readfile.

    Para solucionar este problema, mueva session_start() debajo de las cabeceras y arriba del resto del código para evitar cualquier error que pueda ocurrir debido a una interferencia de sesión.

    Otra solución posible es verificar la codificación del archivo de salida, ya que esta puede no ser la codificación correcta para el tipo de archivo que se está descargando. Asegúrese de que la codificación utilizada sea compatible con el tipo de archivo para evitar cualquier problema con el archivo descargado.

    Por último, verifique que el formato de archivo utilizado sea compatible con la biblioteca PhpWord. Algunos formatos de archivo pueden no ser compatibles con la biblioteca, lo que puede causar que el archivo de salida esté corrupto o alterado.

Comments are closed.