首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用expressjs时,下载的.pdf文件已损坏

使用expressjs时,下载的.pdf文件已损坏
EN

Stack Overflow用户
提问于 2015-04-10 21:39:11
回答 5查看 5.8K关注 0票数 19

我正在使用https://github.com/DaftMonk/generator-angular-fullstack生成的meanjs应用程序。我正在尝试使用phantomjs生成一个.pdf文件,并将其下载到浏览器。

问题是下载的.pdf文件总是显示空白页,而不管页数是多少。服务器上的原始文件未损坏。当我进一步调查时,发现下载的文件总是比磁盘上的原始文件大得多。此外,此问题仅在.pdf文件中发生。其他文件类型工作正常。

我尝试过几种方法,比如res.redirect('http://localhost:9000/assets/exports/receipt.pdf');res.download('client\\assets\\exports\\receipt.pdf')

代码语言:javascript
复制
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);

甚至我也尝试过使用https://github.com/expressjs/serve-static,结果没有任何变化。

我是nodejs的新手。将.pdf文件下载到浏览器的最佳方法是什么?

更新:我正在Windows8.1 64位计算机上运行此程序

EN

回答 5

Stack Overflow用户

发布于 2015-05-03 14:01:51

我在提供静态pdf时也有损坏。我尝试了上面建议的所有方法。然后我发现:在本质上,通常很好的连接负载(package ~0.4.0)的https://github.com/intesso/connect-livereload/issues/39正在破坏pdf。所以只要让它忽略pdf就可以了:

代码语言:javascript
复制
app.use(require('connect-livereload')({ignore: ['.pdf']}));

现在,它可以工作了:

代码语言:javascript
复制
app.use('/pdf', express.static(path.join(config.root, 'content/files')));

...great解脱。

票数 5
EN

Stack Overflow用户

发布于 2015-04-10 22:05:08

这是一种从express提供文件的干净方法,并使用attachment标头来确保文件已下载:

代码语言:javascript
复制
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);
});
票数 4
EN

Stack Overflow用户

发布于 2015-04-26 21:17:15

有几种方法可以做到这一点:

  1. 如果文件是静态文件,如手册、自述文件等,那么您可以告诉express我的文件夹中有静态文件(并且应该直接可用),并将文件保存在那里。这是使用静态中间件完成的:http://expressjs.com/starter/static-files.html

(app.use(express.static(Pathtofile);链接如下:

现在,您可以使用浏览器中的url直接打开文件,如下所示:

代码语言:javascript
复制
window.open('http://localhost:9000/assets/exports/receipt.pdf');

代码语言:javascript
复制
res.redirect('http://localhost:9000/assets/exports/receipt.pdf'); 

应该可以用了。

  1. 的第二种方法是读取文件,数据必须作为缓冲区传入。实际上,如果您直接发送它,它应该会被识别,但您可以尝试使用以下命令将其转换为base64编码:

buf.toString('base64'); base64String = var

然后设置内容类型:

代码语言:javascript
复制
res.writeHead(200, {
                    'Content-Type': 'application/pdf',
                    'Content-Length': stat.size
                });

并将数据作为响应发送。我会试着举一个这样的例子。

编辑:你甚至不需要对它进行编码。你还是可以试一试。但我甚至不需要编码就能让它工作。

此外,您也不需要设置标头。Express为您做到了这一点。下面是API代码片段,用于在pdf不是public/static的情况下获取pdf。你需要API来服务pdf:

代码语言:javascript
复制
router.get('/viz.pdf', function(req, res){
    require('fs').readFile('viz.pdf', function(err, data){
        res.send(data);
    })
});

最后,请注意,用于获取pdf的url具有扩展名pdf,这是为了让浏览器识别传入的文件是pdf。否则,它将保存文件而不带任何扩展名。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29562954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档