Mi interfaz (escrita en VueJS) necesita descargar un archivo grande de un servidor (~ 1 GB pero puede ser aún más grande). Sin embargo, mi enfoque actual es usar streamSaver , aunque esto parece funcionar bien cuando descargo archivos mientras pruebo localmente, parece tener problemas cuando lo pruebo en otros dispositivos (teléfono Android mientras apunta el servidor a 0.0.0.0)
Código front-end para la descarga, actualmente estoy canalizando los datos de recuperación a streamSaver, sin embargo, por lo que entiendo, la solicitud de recuperación debe completarse antes de que comience la acción de descarga, que no es realmente la solución que necesito. Quiero poder iniciar la descarga simultáneamente.
const fileStream = streamSaver.createWriteStream(fileName); const res = await fetch("gets/download-file?" + new URLSearchParams({ relPath: path.join(forPath, fileName) })) const readableStream = res.body if (window.WritableStream && readableStream.pipeTo) { return readableStream.pipeTo(fileStream) .then(() => console.log('done writing')) } window.writer = fileStream.getWriter() const reader = res.body.getReader() const pump = () => reader.read() .then(res => res.done ? window.writer.close() : window.writer.write(res.value).then(pump)) pump()Mi servidor está escrito en express.js, y también he intentado transmitir los datos desde el lado del servidor.
router.get("/download-file", checkPath, async (req, res) => { try { const relativePath = req.query.relPath; const fullPath = path.join(UPLOAD_FOLDER, relativePath); console.log(green("Downloading: ", fullPath)) // res.sendFile(fullPath, (err) => { // if (err) console.log(red(err)) // }) res.setHeader('Content-Type', 'application/octet-stream'); fs.createReadStream(fullPath).pipe(res); } catch (err) { console.log(red(err)) } })He visto Transmitir un archivo de blob grande usando StreamSaver.js y otras respuestas similares, pero todas parecen tener fallas similares de tener que completar la solicitud de recuperación y esperar hasta entonces antes de transmitir una descarga, que no es lo que estoy buscando. .