使用节点将图像上传到Heroku并获取其网址

时间:2018-03-04 19:04:06

标签: node.js image canvas heroku cors

我需要将图像下载到我的Heroku服务器,因此我可以在画布上为客户端绘制它们。我正在使用服务器作为启用了CORS的代理。

Heroku上的我的节点服务器有一个GET请求,它接收一个网址,将其下载到./downloads/image.jpg然后再发送新的网址,例如:http://foo.herokuapp.com/downloads/image.jpg。然后,cilent可以使用该URL在画布上绘制而不会污染它。

我知道Heroku会频繁删除所有上传的图片,而S3会更好用于图片托管,但我只是希望这些图片只能保留一分钟,所以我该怎么办呢?

此外,我尝试从我的浏览器访问图像,就像它在http://foo.herokuapp.com/app/downloads.image.jpg上传一样,但每次都获得404。

1 个答案:

答案 0 :(得分:0)

事实证明,由于其Ephemeral Filesystem

,这在Heroku上是不可能的

自发布问题以来,我已经使用代理请求找到了解决问题的方法:

const express = require("express")
const fetch = require("node-fetch") // To pipe received image back to caller
const cors = require("cors")
const app = express()

app.use(cors()) // Enable cross-origin resource sharing

// GET request to serve as proxy for images
app.get("/proxy", (req, resposnse) => {
  const url = req.query.url
  if (url && url.length > 0) {
    fetch(url)
      .then(res => res.body.pipe(response))
      .catch(err => console.log(err))
  }
})

通过这种方式,任何在/proxy上发送带有指向服务器的图像的URL的请求的人都会将其通过管道返回。

例如:.../proxy?url=https://cats.com/cat.jpg"将返回可以在<canvas>元素上自由绘制的图像。

<img>标签也是如此:<img src=".../proxy?url=https://cats.com/cat.jpg" />