我设计了一个应用程序,允许用户从他们的硬盘驱动器上传图像(每张图像最多500k,大约20张图像)到网站,以便能够以pdf格式制作一些自定义的桌面游戏(例如蛇和梯子)。这些将立即与虾一起创建,然后可供即时下载。
上传的图片和创建的pdfs都不需要永久保存在我的应用端。用户下载pdf时,不再需要它们。
Heroku不支持将文件保存到系统中(它确实允许使用tmp目录,但是说你不应该依赖它来为我敲击它)。我想知道我应该考虑哪些工具/服务来解决这个问题。我看了回形针,我想知道这是否适合这种工作。
答案 0 :(得分:1)
Paperclip
听起来像是理想的候选人。它将保存RAILS_ROOT/public/system/
中的图像,这是持久的和私有的(不应该在共享主机上枚举)。
您可以将其配置为根据需要生成图像的缩略图。
它可以删除相关模型销毁时管理的图像 - 用户下载PDF后,从数据库中删除记录。
Prawn
可能不合适,具体取决于您需要生成的PDF的复杂程度。如果您有$$$,请转到PrinceXML
和princely
宝石。我使用wkhtmltopdf
取得了一些成功,它使用Webkit
HTML / CSS渲染生成PDF - 但它不支持Prince
所做的任何高级页面操作。
答案 1 :(得分:1)
Paperclip走在正确的轨道上,但关键的洞察力是您需要使用S3存储后端(Paperclip默认使用FS,正如您所注意到的那样对Heroku没有好处)。它非常方便;它不使用刷新写入文件系统,而是使用AWS :: S3 gem将它们上传到S3。您可以在此处的rdoc中详细了解它:http://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/storage/s3.rb
以下是流程的工作原理:
我会让您的用户上传他们的多个源图片。这篇文章是关于允许使用回形针的一个模型的多个附件:http://www.cordinc.com/blog/2009/04/multiple-attachments-with-vali.html。
然后当你准备好生成PDF时(可能是在后台工作中,对吗?),你所做的就是将所有源图像下载到tmp /中的某个地方(确保目录基于你的模型ID或所以,如果两个人同时这样做,文件就不会被踩到)。下载完所有图像后,即可生成PDF。我知道这是使用文件系统,但只要您在一个请求或作业周期中完成所有文件系统交互,它就会起作用,您的文件仍然存在。我在几个生产网络应用程序中使用此方法。你不能指望在请求之间存在tmp /,但在一个请求中它是可靠的。
使用回形针将生成的PDF存储在S3上也很有意义,因为这样您就可以将用户的S3 URL传递给用户。如果你想要的话,如果你不想支付S3的费用,你可以经常做一些事情来清除文件,但它们应该是微不足道的。