"path_for" S3 上的 ActiveStorage 附件
"path_for" ActiveStorage attachments on S3
我有一个托管在 Heroku 上的应用程序,其中一个用户可以回答测验并提交一些照片(通过 Active Storage,文件被发送到 S3 存储桶),另一个用户可以看到并检索答案和相片。
我使用了一种方法让用户将测验的所有照片下载到 .zip 文件中,但我在实时应用程序中不断收到此错误消息:
NoMethodError (undefined method `path_for' for #ActiveStorage::Service::S3Service:0x0000000006b47368>):
用于创建 .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
我可以在项目视图上显示用户发送的所有图像,当代码在本地 运行 时,批量下载工作正常。
对此有什么想法吗?
您正在使用 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
模块来帮助将附件下载到临时文件,请参阅 Active Storage Overview Guide 以获取有关使用 ActiveStorage::Downloading
的一些信息.
此过程可能会变得缓慢且占用大量资源,因此您可能希望将 zip 创建推到后台作业,然后在作业完成时通知相关人员。
我有一个托管在 Heroku 上的应用程序,其中一个用户可以回答测验并提交一些照片(通过 Active Storage,文件被发送到 S3 存储桶),另一个用户可以看到并检索答案和相片。
我使用了一种方法让用户将测验的所有照片下载到 .zip 文件中,但我在实时应用程序中不断收到此错误消息:
NoMethodError (undefined method `path_for' for #ActiveStorage::Service::S3Service:0x0000000006b47368>):
用于创建 .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
我可以在项目视图上显示用户发送的所有图像,当代码在本地 运行 时,批量下载工作正常。
对此有什么想法吗?
您正在使用 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
模块来帮助将附件下载到临时文件,请参阅 Active Storage Overview Guide 以获取有关使用 ActiveStorage::Downloading
的一些信息.
此过程可能会变得缓慢且占用大量资源,因此您可能希望将 zip 创建推到后台作业,然后在作业完成时通知相关人员。