No se puede descargar el archivo del cubo s3 usando Laravel

Tengo un archivo que tiene una ubicación: https://lms3.fra1.digitaloceanspaces.com/answers/5/1_4.pdf. He configurado el espacio digital del océano para el controlador s3 y puedo subir el archivo también. Pero cuando intento descargar este archivo, dice que el archivo no se encuentra.

Para subir el archivo, escribí este código:

  $name = auth()->id().'_'.$cq->id.'.pdf';
  $path = Storage::disk('do')->putFileAs('answers/' . $exam->id,$request->file('answer'), $name, 'public');

Y el $path me devuelve answers/5/1_4.pdf que se guarda en la base de datos.

El código que he utilizado para la descarga:

$file = Storage::disk('do')->url($path);
return response()->download($file);

La respuesta muestra un error y dice que https://lms3.fra1.digitaloceanspaces.com/answers/5/1_4.pdf no existe. Este es un archivo de acceso público. No puedo averiguar qué está mal con este código.

¿Puede alguien ayudarme?

Pregunta hecha hace 3 años, 4 meses, 26 días - Por apiartisan


2 Respuestas:

  • El problema que estás experimentando probablemente se debe a que el método url() de Laravel devuelve una URL pública para acceder al archivo en el espacio de almacenamiento de DigitalOcean Spaces, pero la función response()->download() espera un archivo local en el sistema de archivos local.

    Para descargar un archivo alojado en DigitalOcean Spaces, puedes usar la función Storage::disk('do')->download() en lugar de response()->download(). Aquí te muestro cómo podrías modificar tu código para descargar el archivo correctamente:

    php
    $file = 'answers/5/1_4.pdf'; // Ruta del archivo en el almacenamiento de DigitalOcean Spaces
    $filePath = Storage::disk('do')->path($file); // Obtiene la ruta local del archivo en el almacenamiento
    
    return response()->download($filePath);
    

    Con este cambio, deberías poder descargar el archivo correctamente desde DigitalOcean Spaces. Asegúrate de comprobar que el archivo exista en la ruta especificada y que tenga los permisos adecuados para ser descargado.

    Respondida el Dec 21, 2020 a las 22:21 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas del error:

    Nombre de archivo incorrecto: Comprueba que el valor de $path sea correcto y coincida con el nombre del archivo en el bucket de S3. Configuración de permisos: Asegúrate de que el archivo tiene permisos de acceso público en el bucket de S3. Región de S3 incorrecta: Verifica que estés utilizando la región correcta de S3 al configurar el controlador de S3. Firma de URL caducada: Las URL prefirmadas de S3 caducan después de un cierto período de tiempo. Intenta generar una nueva URL prefirmada para la descarga. Error de red: Comprueba si hay problemas de red que impidan que Laravel se conecte al bucket de S3.

    Solución:

    • Verifica el nombre del archivo: Imprime el valor de `$path` y compara con el nombre del archivo en el bucket de S3.
    • Configura los permisos: En el panel de control de DigitalOcean, navega hasta el bucket de S3 y establece los permisos del archivo como "Público".
    • Verifica la región de S3: Asegúrate de que el controlador de S3 en Laravel esté configurado para la región correcta donde se encuentra el bucket de S3.
    • Genera una nueva URL prefirmada: Utiliza el método `temporaryUrl()` del controlador de S3 para generar una nueva URL prefirmada con una vida útil más larga.
    • Comprueba la conexión de red: Intenta hacer ping al bucket de S3 desde tu servidor Laravel para verificar la conectividad.

    Código actualizado:*

    php
    $expiresAt = now()->addMinutes(10);
    $file = Storage::disk('do')->temporaryUrl($path, $expiresAt);
    return response()->download($file);
    

    Esto generará una URL prefirmada que será válida durante 10 minutos. Asegúrate de reemplazar $path con el nombre de archivo correcto en el bucket de S3.

    Respondida el Dec 21, 2020 a las 22:29 - por Gemini

    Votos positivos: 0 | Votos negativos: 0