在ExpressJS中管道远程文件

cyb*_*bat 18 javascript node.js express

我想读一个远程图像并显示它.我可以保存文件但不能正确显示代码.理想情况下,我只想在不进行处理的情况下正确传递文件 - 不确定是否需要tmp文件步骤.此代码不显示任何内容 - 没有错误.我也尝试了res.pipe(响应).

var url = 'http://proxy.boxresizer.com/convert?resize=50x50&source=' + filename

var request = http.get(url, function(response) {

  var tmp = path.join(require('os').tmpDir(), filename);

  var outstream = require('fs').createWriteStream(tmp);

  response.pipe(outstream);
  response.on('end', function() {
    res.set('Content-Type', 'image/jpg');
      res.pipe(outstream);
      res.end();
  });
});
Run Code Online (Sandbox Code Playgroud)

cyb*_*bat 28

好吧,我仍然想知道如何完成上述工作,但我在请求模块的一行中解决了我的问题!

var url = 'http://proxy.boxresizer.com/convert?resize=50x50&source=' + filename
require('request').get(url).pipe(res);  // res being Express response
Run Code Online (Sandbox Code Playgroud)

  • 这要好得多.您没有将文件保存在磁盘上.如果你想保存响应,在`response.pipe(outstream);`之后你必须用`createreadstream`重新打开文件并将它传递给`res`.在问题中你做了'res.pipe(outstream);`这是一个错误.你必须将文件传递给`res`. (2认同)

ABa*_*bin 11

由于request已弃用,您也可以node-fetch像这样使用:

app.get("/", (req, res) => {
    fetch(actualUrl).then(actual => {
        actual.headers.forEach((v, n) => res.setHeader(n, v));
        actual.body.pipe(res);
    });
});
Run Code Online (Sandbox Code Playgroud)


Bil*_*ese 6

这似乎对我有用,使用fetch()Node 18 中包含的标准,这与 有点不同node-fetch,请参阅 github.com/node-fetch/node-fetch#bodybody:

app.get("/", (req, res) => {
  fetch(url).then(({ body, headers }) => {
    body.pipeTo(
      new WritableStream({
        start() {
          headers.forEach((v, n) => res.setHeader(n, v));
        },
        write(chunk) {
          res.write(chunk);
        },
        close() {
          res.end();
        },
      })
    );
  });
});

Run Code Online (Sandbox Code Playgroud)