使用Imagemagick转换而不保存文件(在Heroku上)

时间:2017-03-10 04:01:25

标签: javascript node.js heroku imagemagick imagemagick-convert

目标:拥有一个Node.js服务器,该服务器将从PUT调用中获取pdf,并返回转换为.jpg的每个页面。当然,最终,我并不关心它是如何完成的。

我已经成功创建了一个Node.js服务器,该服务器使用imagemagick将pdf转换为图像。它是一个快速服务器,它使用这个imagemagick npm包,它包装了imagemagick CLI。

这里是路线的代码,可以很好地在本地运行

app.put('/v1/convert-pdf', (req, res) => {
    res.status(202).send({ message: "we're working on it, alright?!" })

    console.log("beginning image conversion")
    im.convert(["-density", "144", "./content/pdf/foo.pdf", "./content/img/bar.jpg"], (err, stdout) => {
    if (err) {
        console.error(err)
    } else {
        console.log(stdout)
        console.log("finished converting pdfs");
    }

    })
})

上面的路线输出了一堆名为foo-0.jpg,foo-1.jpg等的.jpg文件...现在我要做的是拿一个文件,放到路线上,转换它通过imagemagick,然后将其交还给用户(最终我将它放入S3存储桶中,但宝贝步骤)。

如果确实需要将文件保存到Heroku中的文件夹,我该怎么做?我试图从Heroku读取/写入,但我没有收到错误(除非其中一个文件/目录不存在),但我也没有看到该文件

1 个答案:

答案 0 :(得分:1)

总结我们在评论中的对话,以防它对任何人都有帮助:

当您运行heroku run bash时,您将无法看到应用程序创建和保存的文件的原因是因为它实际上会旋转新的dyno并且无法访问文件系统运行应用程序的dyno。

如上所述,执行此操作的最佳方法是在转换完成后立即将结果图像上传到S3,并提供任何传入请求以通过S3检索这些文件。

如果运行单个web dyno,这不会是一个问题,但如果你运行多个,那么转换后的文件只能在接收和转换PDF的dyno上使用,所以其他dynos不会可以访问它们。

此外,每个部署都会创建新的dynos,因此除非您将这些文件存储在S3之类的内容中,否则它们会在您向上推动时丢失。