angularjs - page - change title in angular 4
Los archivos.pdf descargados están dañados cuando se usa Expressjs (5)
Aquí hay una manera limpia de servir un archivo desde Express, y usa un encabezado attachment
para asegurarse de que el archivo se descarga:
var path = require(''path'');
var mime = require(''mime'');
app.get(''/download'', function(req, res){
//Here do whatever you need to get your file
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader(''Content-disposition'', ''attachment; filename='' + filename);
res.setHeader(''Content-type'', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
Estoy trabajando en la aplicación meanjs
generada usando https://github.com/DaftMonk/generator-angular-fullstack . Estoy intentando generar un archivo .pdf usando phantomjs
y descargarlo en el navegador.
El problema es que el archivo .pdf descargado siempre muestra las páginas en blanco sin importar el número de páginas. El archivo original en el servidor no está dañado. Cuando investigué más, descubrí que el archivo descargado siempre es mucho más grande que el archivo original en el disco. También este problema ocurre solo con archivos .pdf. Otros tipos de archivos funcionan bien.
He intentado varios métodos como res.redirect(''http://localhost:9000/assets/exports/receipt.pdf'');
, res.download(''client//assets//exports//receipt.pdf'')
,
var fileSystem = require(''fs'');
var stat = fileSystem.statSync(''client//assets//exports//receipt.pdf'');
res.writeHead(200, {
''Content-Type'': ''application/pdf'',
''Content-Length'': stat.size
});
var readStream = fileSystem.createReadStream(''client//assets//exports//receipt.pdf'');
return readStream.pipe(res);
e incluso lo he intentado con https://github.com/expressjs/serve-static sin cambios en el resultado.
Soy nuevo en nodejs
. ¿Cuál es la mejor manera de descargar un archivo .pdf al navegador?
Actualización: estoy ejecutando esto en una computadora con Windows 8.1 64bit
Hay un par de maneras de hacer esto:
- Si el archivo es estático, como un folleto, un archivo léame, etc., puede decirle a Express que mi carpeta tiene archivos estáticos (y debería estar disponible directamente) y guardar el archivo allí. Esto se hace usando middleware estático: app.use (express.static (pathtofile)); Aquí está el enlace: http://expressjs.com/starter/static-files.html
Ahora puede abrir directamente el archivo utilizando la url del navegador como:
window.open(''http://localhost:9000/assets/exports/receipt.pdf'');
o
res.redirect(''http://localhost:9000/assets/exports/receipt.pdf'');
debería estar trabajando
La segunda forma es leer el archivo, los datos deben venir como un búfer. En realidad, debería reconocerse si lo envías directamente, pero puedes intentar convertirlo a codificación base64 usando:
var base64String = buf.toString (''base64'');
a continuación, establezca el tipo de contenido:
res.writeHead(200, {
''Content-Type'': ''application/pdf'',
''Content-Length'': stat.size
});
y enviar los datos como respuesta. Intentaré poner un ejemplo de esto.
EDITAR: Ni siquiera es necesario codificarlo. Puedes intentarlo todavía. Pero pude hacerlo funcionar sin siquiera codificarlo.
Además, tampoco es necesario configurar los encabezados. Express lo hace por ti. A continuación se encuentra el fragmento de código API escrito para obtener el pdf en caso de que no sea público / estático. Necesita API para servir el pdf:
router.get(''/viz.pdf'', function(req, res){
require(''fs'').readFile(''viz.pdf'', function(err, data){
res.send(data);
})
});
Por último, tenga en cuenta que la url para obtener el pdf tiene una extensión pdf, esto es para que el navegador reconozca que el archivo entrante es pdf. De lo contrario, guardará el archivo sin ninguna extensión.
No tengo experiencia con los marcos que ha mencionado, pero recomendaría usar una herramienta como Fiddler para ver qué está pasando. Por ejemplo, es posible que no necesite agregar un encabezado de longitud de contenido ya que está transmitiendo y su marco de trabajo realiza una codificación de transferencia fragmentada, etc.
Por lo general, si está utilizando phantom para generar un pdf, el archivo se escribirá en el disco y debe proporcionar la ruta y una devolución de llamada a la función de procesamiento.
router.get(''/pdf'', function(req, res){
// phantom initialization and generation logic
// supposing you have the generation code above
page.render(filePath, function (err) {
var filename = ''myFile.pdf'';
res.setHeader(''Content-type'', "application/pdf");
fs.readFile(filePath, function (err, data) {
// if the file was readed to buffer without errors you can delete it to save space
if (err) throw err;
fs.unlink(filePath);
// send the file contents
res.send(data);
});
});
});
Tuve corrupción al servir pdfs estáticos también. Intenté todo lo sugerido anteriormente. Luego encontré esto: https://github.com/intesso/connect-livereload/issues/39 En esencia, el excelente conector-livereload (paquete ~ 0.4.0) estaba corrompiendo el pdf. Así que hazlo para ignorar los pdfs a través de:
app.use(require(''connect-livereload'')({ignore: [''.pdf'']}));
ahora esto funciona:
app.use(''/pdf'', express.static(path.join(config.root, ''content/files'')));
... gran alivio.