18

我需要使用tmpHeroku (Cedar) 上的文件夹来写入一些临时数据,我正在尝试这样做:

open("#{Rails.root}/tmp/#{result['filename']}", 'wb') do |file|
  file.write open(image_url).read 
end

但这会产生错误

Errno::ENOENT: No such file or directory - /app/tmp/image-2.png

我正在尝试这段代码,它在本地主机上正常运行,但我无法让它在 Heroku 上运行。

tmp将一些文件保存到Heroku(Cedar 堆栈)上的目录的正确方法是什么?

谢谢

编辑: 我正在运行需要访问 tmp 文件的延迟作业的方法。

EDIT2: 我在做什么:

files.each_with_index do |f, index|
      unless f.nil?
        result = JSON.parse(buffer)
        filename = "#{Time.now.to_i.to_s}_#{result['filename']}" # thumbnail name
        thumb_filename = "#{Rails.root}/tmp/#{filename}"

        image_url = f.file_url+"/convert?rotate=exif"

        open("#{Rails.root}/tmp/#{result['filename']}", 'wb') do |file|
          file.write open(image_url).read 
        end

        img = Magick::Image.read(image_url).first
        target = Magick::Image.new(150, 150) do
          self.background_color = 'white'
        end
        img.resize_to_fit!(150, 150)
        target.composite(img, Magick::CenterGravity, Magick::CopyCompositeOp).write(thumb_filename)

        key = File.basename(filename)
        s3.buckets[bucket_name].objects[key].write(:file => thumb_filename)

        # save path to the new thumbnail to database
        f.update_attributes(:file_url_thumb => "https://s3-us-west-1.amazonaws.com/bucket/#{filename}")
      end
    end

我有关于图像的数据库信息。这些图像存储在 Amazon S3 存储桶中。我需要为这些图像创建缩略图。所以我正在浏览一张图片,加载图片,临时保存它,然后调整它的大小,然后我会将这个缩略图上传到 S3 存储桶。

但是这个过程似乎不适用于 Heroku,那么,我该怎么做(我的应用程序在 Heroku 上运行)?

4

2 回答 2

17

/tmp包含在您的 git 存储库中吗?在你的.slugignore? Heroku 上可能不存在该目录。

尝试在写入之前折腾一个快速的 mkdir:

Dir.mkdir(File.join(Rails.root, 'tmp'))

甚至在初始化程序或其他东西中......

于 2013-10-08T16:28:41.163 回答
1

这是一个优雅的方式

f = File.new("tmp/filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd.to_s + ("/tmp")) # See your newly created file in /tmp

不要忘记,每当您的应用程序重新启动(出于任何原因,包括您无法控制的原因)时,您的文件将被删除,因为它们只是临时存储的。

试试看heroku restart,你会发现你创建的新文件已经不在了

于 2019-02-17T08:37:51.640 回答