如何将控制器中生成的pdf文件上传到S3存储桶

How to upload generate pdf file in controller to S3 bucket

我正在使用 wicked_pdf 生成 pdf 文件并想将其上传到 s3 存储桶,因为 heroku 未保存在 public 中。但是面临如何上传到那里或如何在保存路径中提供 s3 存储桶路径的问题。

这是我的控制器代码:-

pdf = render_to_string :pdf => "user_detail"

# then save to a file
save_path = Rails.root.join('pdfs','filename.pdf')
File.open(save_path, 'wb') do |file|
  file << pdf
end

您可以使用 aws-sdk gem。

gem 在您的环境文件中查找 AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY 和 AWS_REGION,因此您需要添加这些。您可以为存储桶所在的区域创建一个 S3 资源,并创建一个具有唯一文件名的对象并调用 upload_file,如下所示。

require 'aws-sdk'

file_name = 'your-file.pdf'

s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
obj = s3.bucket('your-s3-bucket-name').object(file_name)
puts "Uploading file #{file_name}"
obj.upload_file("/Users/username/path/to/#{file_name}")
puts "Done"

除了 answer you can use Aws::S3::Object#put。如果对象是字符串 不是磁盘上文件的 IO 对象,这很有用:

filename = 'filename.pdf'
pdf = render_to_string :pdf => "user_detail"
s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
obj = s3.bucket('your-s3-bucket-name').object(filename)

# upload pdf data as a string
obj.put(body: pdf)

# or as an IO object
save_path = Rails.root.join('pdfs', filename)
File.open(save_path, 'wb') do |file|
  file << pdf
  obj.put(body: file)
end

这里是an example of file uploading on docs.aws.amazon.com

S3 gem 可以让您执行此 pdf 上传。需要传递 Bucket Name、Access Key ID、Access Key Secret。

filename = "invoice.pdf"
# render your pdf file
pdf = render_to_string(:pdf => filename, template: "invoice.html.erb")
# S3 upload Code goes here
service = S3::Service.new(:access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'])
bucket = service.buckets.find(ENV['S3_BUCKET_NAME'])
file = bucket.objects.build("invoices/#{filename}")
file.content = pdf
file.content_type = "application/pdf"
file.acl = :public_read
file.save
# Done, use the URL below as needed
s3url = "http://#{ENV['S3_BUCKET_NAME']}.s3.amazonaws.com/invoices/#{filename}"