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.

API REST de PHP: cómo devolver un archivo o descargarlo.

Tengo una API de REST y el endpoint es getfilestart.php. Lo que hace es buscar el nombre del archivo en la base de datos usando PDO. ¿Cómo puedo obtener el archivo y devolverlo como un archivo o descargarlo automáticamente usando Postman o en el navegador? Intenté varios métodos pero no puedo obtener el archivo. El directorio está en ../files/

Aquí está la función para descargar

    public function downloadFile($param){
        $base_url = $SERVER['REQUEST_SCHEME']."://".$SERVER['SERVER_NAME'];

    $q = "SELECT * FROM data_file WHERE module_id = ".$param;
    $stmt = $this->conn->prepare($q);
    $stmt->execute();

    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $filename = $row['file_name'];
    $request_url = $base_url .'/mtc_project_server/files/'.$filename;
}

Si imprimo el request_url es http://localhost/mtc_project_server/files/mir4.PNG que es el archivo real. ¿Cómo puedo descargarlo usando REST? Intenté hacer cURL y file_get_contents y aún no funciona. Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para devolver el archivo como una respuesta o descargarlo automáticamente, puede modificar la función downloadFile para hacer lo siguiente:

    • Obtener los datos del archivo usando file_get_contents o cURL
    • Establecer las cabeceras de respuesta apropiadas
    • Dar salida a los datos del archivo al cliente

    Aquí hay una implementación de ejemplo:

    public function downloadFile($param){
            $base_url = $_SERVER['REQUEST_SCHEME'] . "://" . $_SERVER['SERVER_NAME'];
    
            $q = "SELECT * FROM data_file WHERE module_id = " . $param;
            $stmt = $this->conn->prepare($q);
            $stmt->execute();
    
            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            $filename = $row['file_name'];
            $file_path = '../files/' . $filename;
    
            // Comprobar si el archivo existe
            if (!file_exists($file_path)) {
                http_response_code(404);
                exit;
            }
    
            // Establecer las cabeceras de respuesta
            header('Content-Type: application/octet-stream');
            header('Content-Transfer-Encoding: Binary');
            header('Content-disposition: attachment; filename="' . basename($file_path) . '"');
    
            // Dar salida a los datos del archivo
            readfile($file_path);
        }
    

    Esta implementación primero comprueba si el archivo existe en la ruta especificada y devuelve un error 404 si no lo hace. Luego establece las cabeceras de respuesta apropiadas para indicar que la respuesta debe tratarse como un archivo binario adjunto, con el nombre de archivo establecido en el nombre de archivo original del archivo. Finalmente, da salida a los datos del archivo usando la función readfile, que da salida al contenido de un archivo al cliente.

    Con esta implementación, debería poder descargar el archivo utilizando Postman o cualquier navegador web haciendo una solicitud a su punto final REST `http://localhost/mtc_project_server/getfilestart.php?param={file_id}`.

Comments are closed.