Tengo este código que crea una URL firmada para descargar un archivo específico en mi depósito:
exports.download = functions.https.onRequest((req, res) => { const userID = req.query.userID; const downloadID = req.query.downloadID; const fileName = req.query.fileName; admin .storage() .bucket() .file(`userUploads/${userID}/${downloadID}/${fileName}`) .getSignedUrl({ version: "v4", action: "read", expires: Date.now() + 15 * 60 * 1000, // 15 minutes }) .then((signedURLArray) => { const url = signedURLArray[0]; // return res.download(url); return res.redirect(url); }) .catch((err) => { return res.send(err); }); });He intentado:
res.setHeader( `"content-disposition", "attachment; filename=${fileName}"` ); con res.redirect pero solo me da un HTTP_TOKEN_ERROR . Si uso res.redirect() sin configurar encabezados adicionales, solo verá el archivo en el navegador, no lo descargará; solo quiero que el usuario pueda descargar el archivo.
Obviamente, res.download no funciona ya que el archivo en cuestión no está en el servidor, se sirve en algún otro servidor donde se encuentran mis archivos de cubo (probablemente algún dominio de storage.googleapis.com )
ACTUALIZAR:
Como puede ver en la solicitud de respuesta:
Está enviando los datos correctos al navegador.
A medida que redirige al servidor de Google, se vuelve responsable de los encabezados de la respuesta y, específicamente, de la Content-disposition . Los metadatos de los archivos almacenados en el almacenamiento de Google se pueden configurar en o después de cargar el archivo. Tu encabezado debería verse así:
Content-Disposition: attachment; filename="file.ext..."Consulte estos documentos para ver las posibles opciones sobre cómo configurar los metadatos de los archivos manualmente a través de gsutil:
Para generar una URL firmada con un encabezado personalizado (p. ej Content-Disposition ) con la API de administración de almacenamiento de Google, debe agregarse a través de un parámetro de configuración Disposición de responseDisposition con el valor deseado
Ejemplo de uso:
... admin .storage() .bucket() .file(`userUploads/${userID}/${downloadID}/${fileName}`) .getSignedUrl({ responseDisposition: "attachment", version: "v4", action: "read", expires: Date.now() + 15 * 60 * 1000, // 15 minutes }) ...Consulte la referencia de MDN para ver los posibles valores de encabezado aquí: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition
Consulte la documentación de la biblioteca api de nodejs para el almacenamiento de Google aquí y enlace a las líneas donde se explican aquí las propiedades de archivos adjuntos, promptSaveAs y responseDisposition .