Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 允许用户从我的S3存储桶下载图像_Ruby On Rails_Ruby_Amazon S3_Uri - Fatal编程技术网

Ruby on rails 允许用户从我的S3存储桶下载图像

Ruby on rails 允许用户从我的S3存储桶下载图像,ruby-on-rails,ruby,amazon-s3,uri,Ruby On Rails,Ruby,Amazon S3,Uri,我正在尝试构造一种方法,允许用户从我的s3存储桶下载pdf文件(目前确实如此) 但url的某些部分可能会不时更改,例如/timetables之后的id号、文件名(但始终为pdf)和文件名之后的id号 这就是我目前所拥有的 def download path = "images/timetables/14/original.pdf?" data = open("http://#{ENV['AWS_BUCKET']}.s3.amazonaws.com/#{path}/1392904333")

我正在尝试构造一种方法,允许用户从我的s3存储桶下载pdf文件(目前确实如此)

但url的某些部分可能会不时更改,例如/timetables之后的id号、文件名(但始终为pdf)和文件名之后的id号

这就是我目前所拥有的

def download
  path = "images/timetables/14/original.pdf?"
  data = open("http://#{ENV['AWS_BUCKET']}.s3.amazonaws.com/#{path}/1392904333") 
  send_data data.read, filename: 'Timetable',
                       type: 'application/pdf', 
                       disposition: 'attachment', 
                       stream: 'true', 
                       buffer_size: '4096'

end
有没有办法在飞行中获取这些信息,或者我只能硬编码?理想情况下,我希望尽可能多地将路径存储到变量中

有谁能告诉我如何正确地做这件事吗

谢谢

使用它可以更轻松地管理上传。使用此选项,您将创建一个表来保存一条记录,该记录将动态引用您上传的文件

工作流程如下所示:

class PdfRecord < ActiveRecord::Base
  has_attached_file :pdf, :storage => :s3,
    :bucket => 'S3_BUCKET_NAME',
    :s3_credentials => {
      :access_key_id => 'AWS_ACCESS_KEY_ID',
      :secret_access_key => 'AWS_SECRET_ACCESS_KEY'
    }
end
@pdf_record = PdfRecord.find(which ever one you want)
@pdf_record.pdf.url # => the S3 url
  • 您将有问题的PDF上载到应用程序
  • 回形针将其上传到S3并将URL保存到数据库中
  • 您提供了一个指向用户的链接,以获取PDF的S3URL
  • 或者你给他们你的记录的链接,然后你开始下载你上面发布的内容
首先,保存pdf文件引用的模型如下所示:

class PdfRecord < ActiveRecord::Base
  has_attached_file :pdf, :storage => :s3,
    :bucket => 'S3_BUCKET_NAME',
    :s3_credentials => {
      :access_key_id => 'AWS_ACCESS_KEY_ID',
      :secret_access_key => 'AWS_SECRET_ACCESS_KEY'
    }
end
@pdf_record = PdfRecord.find(which ever one you want)
@pdf_record.pdf.url # => the S3 url
向用户提供该url将允许他们直接下载pdf。但是,如果您想隐藏url并允许您在不中断链接的情况下更新pdf,则可以向用户提供指向
pdf\u记录的链接,然后从控制器开始下载:

# give your users this url, as defined in your routes.rb
pdf_record_url(@pdf_record)
def show
  pdf_record = PdfRecord.find(params[:id])
  data = open(pdf_record.pdf.url) 
  send_data data.read, filename: pdf_record.pdf_file_name,
                       type: pdf_record.pdf_content_type, 
                       disposition: 'attachment', 
                       stream: 'true', 
                       buffer_size: '4096'
end
然后在pdf_记录控制器的显示操作中:

# give your users this url, as defined in your routes.rb
pdf_record_url(@pdf_record)
def show
  pdf_record = PdfRecord.find(params[:id])
  data = open(pdf_record.pdf.url) 
  send_data data.read, filename: pdf_record.pdf_file_name,
                       type: pdf_record.pdf_content_type, 
                       disposition: 'attachment', 
                       stream: 'true', 
                       buffer_size: '4096'
end

现在,您可以随时更新该
pdf\u记录
,因为您的用户有一个指向该记录的链接,而不是实际的pdf文件,所以该链接将始终有效。

您能再次解释一下这个问题吗?为什么文件名会改变?是什么触发了这种变化?是否只更改名称或内容?这是一个安全功能吗?谢谢你这么深入的回答,我已经在用回形针了,所以我稍后会试试