【问题标题】:Download a pdf and upload it on s3 in rails下载 pdf 并将其上传到 rails 中的 s3
【发布时间】:2018-08-27 16:05:44
【问题描述】:

所以基本上我正在尝试下载一个 pdf 文件并将其上传到亚马逊存储桶上,是否可以在不创建临时文件的情况下做到这一点?

要下载 pdf 我这样做:

RestClient::Request.execute(
  :method => :get,
  :url => "#{@url}/test/#{id}/pdf",
  :headers => json_headers.merge(jwt_headers(access_token))
) do |response|
  disconnect if response.code == 401
  return unless response.code == 200
  response.body
end

但是我可以直接将 response.body 以 pdf 格式上传到亚马逊吗? 我对 Rails 有点陌生,所以如果有更好的方法或者这完全是错误的,请告诉我

【问题讨论】:

    标签: ruby-on-rails pdf amazon-s3 rest-client


    【解决方案1】:

    您也可以使用 s3 gem,S3 库提供对 Amazon 简单存储服务的访问。 检查here

    在您的 Gemfile 中添加 s3 gem,下面的代码适合您。

    require 'open-uri'
    require 's3'
    
    aws_object = S3::Service.new(access_key_id: 'YOUR_ACCESS_KEY', secret_access_key: 'YOUR_SECRET_ACCESS_KEY') # Save it on server for security.
    bucket = aws_object.buckets.find('bucket_name')
    url = 'http://www.example.com/url' # Your file url
    downloded_file = open(url)
    
    new_file = bucket.objects.build('desired_file_name_with_extention')
    new_file.content = (File.read downloded_file)
    
    new_file.save
    

    【讨论】:

    • 我想继续使用rest-client来下载文件,当我尝试使用rest客户端的方法时,我得到:没有这样的文件或目录@rb_file_s_size
    【解决方案2】:

    如果您的文件下载正确,您可以这样做,然后您可以一次上传,要上传到s3 存储桶,您需要配置AWS S3 存储桶,然后按照以下说明进行操作

    Gemfile

    gem 'aws-sdk', '~> 2'
    

    然后捆绑安装

    # Configuration
    Aws.config.update({
        region: 'region_name', #=> like 'us-east-2'
        credentials: Aws::Credentials.new('S3_ACCESS_KEY', 'S3_SECRET_KEY')
    })
    
    
    #=> do |response|
    File.open("#{response.headers['content-id']}_#{response.headers['object-id']}.pdf", 'wb') do |f|
    
        # Save pdf to application root folder
        f.write(response.body)
        s3 = Aws::S3::Resource.new(region:'us-east-2')
        file_name =  "#{Rails.root}/#{response.headers['content-id']}_#{response.headers['object-id']}.pdf"
        bucket_name = 'S3_BUCKET_NAME'
    
        # Upload this file to s3 bucket
        key = File.basename(file_name)
        obj = s3.bucket(bucket_name).object(key)
        obj.upload_file(file_name, acl:'public-read')
    
        # Remove this file from application root folder at a time if you don't need this in the future
        #FileUtils.rm_f(file_name)
    end
    

    如果您需要在上传到s3 后删除此文件,请取消注释,如FileUtils.rm_f(file_name)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 2022-11-05
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2014-04-06
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多