【问题标题】:"path_for" ActiveStorage attachments on S3S3 上的“path_for”ActiveStorage 附件
【发布时间】:2019-05-13 22:30:33
【问题描述】:

我有一个托管在 Heroku 上的应用程序,其中一个用户可以回答测验并提交一些照片(通过 Active Storage,文件被发送到 S3 存储桶),另一个用户可以看到检索的答案和照片。

我使用了一种方法,让用户将测验的所有照片下载到 .zip 文件中,但我在实时应用程序中不断收到此错误消息:

NoMethodError(#ActiveStorage::Service::S3Service:0x0000000006b47368 的未定义方法 `path_for'>):

用于创建.zip文件的方法是:

def quiz_photos_download
  @quiz = Quiz.find(params[:quiz_id])
  @project = Project.find(@quiz.project_id)
  @photos = @quiz.room_photos

  arquivo = "#{Rails.root}/tmp/quiz_photos.zip"

  Zip::File.open(arquivo, Zip::File::CREATE) do |zipfile|
    @photos.each do |photo|
      zipfile.add(photo.filename, ActiveStorage::Blob.service.send(:path_for, photo.key))
    end
  end
      send_file(arquivo, :type => 'application/zip', :filename => "Fotos "+@project.name+".zip")
end

我可以在项目视图上显示用户发送的所有图像,并且在本地运行代码时批量下载效果很好。

对此有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails amazon-s3 rails-activestorage


    【解决方案1】:

    您正在使用 S3 后端来存储您的 Active Storage 附件,因此文件在某个 S3 存储桶中而不是在您的文件系统中的任何位置上。没有像磁盘服务那样使用的路径。

    您不必通过路径将文件添加到 zip 文件,而是必须从 S3 下载图像并将数据直接添加到 zip 文件中。像这样的:

    # The streaming API is a bit easier for this.
    Zip::OutputStream.open(arquivo) do |zip|
      @photos.each do |photo|
        zip.put_next_entry(photo.filename)
        zip.print(photo.download)
      end
    end
    

    photo.download 调用会将文件从 S3 下载到内存中的字符串中。这可能会占用比您想要的更多的内存,因此您可能希望使用ActiveStorage::Downloading 模块来帮助下载临时文件的附件,有关使用ActiveStorage::Downloading 的一些信息,请参阅Active Storage Overview Guide

    此过程可能会变得缓慢且占用大量资源,因此您可能希望将 zip 创建推到后台作业,然后在作业完成时通知此人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-18
      • 2019-06-12
      • 1970-01-01
      • 2018-06-17
      • 2018-11-16
      • 2018-09-28
      • 2021-05-02
      • 2018-10-31
      相关资源
      最近更新 更多