S3上的回形针处理器超时

时间:2012-09-07 09:43:35

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

我正在将数字签名插入处理器内的pdf文件中,但不断出现AWS::S3::ERRORS::Requestimeout错误。什么是超时?有没有什么办法可以保持连接打开,直到文件上传?

  

未读取或写入与服务器的套接字连接   在超时期限内。空闲连接将被关闭。

这是我的代码:

模型:

...

has_attached_file :receipt_file,
                    :storage => :s3,
                    :s3_credentials => "#{Rails.root}/config/s3.yml",
                    :path => "/:style/:id/:filename",
                    :s3_protocol => "https",
                    :styles => {dummy:""},
                    processors: [:SignPdf]
 #process_in_background :receipt_file

...

处理器

module Paperclip


    class SignPdf < Processor
      attr_accessor :receipt_id,:style
     S3_CONFIG = YAML.load_file("#{::Rails.root}/config/s3.yml")[Rails.env]
     ORIGAMIDIR = "/ruby/1.9.1/gems/origami-1.2.4/lib"


      def initialize(file, options = {}, attachment = nil)
        @file           = file
        @current_format = File.extname(@file.path)
        @basename       = File.basename(@file.path, @current_format)
        @attachment = attachment
      end

        def make

         signPdf(@file) 
         @file
      end

    end
end

begin
  require 'origami'
rescue LoadError
  $: << ORIGAMIDIR
  require 'origami'
end
include Origami
def signPdf(file)

        certFile = "#{::Rails.root}/lib/assets/Cert.pem"
        rsakeyFile = "#{::Rails.root}/lib/assets/pk.pem"
        passphrase = "o2Receipts"

        key4pem=File.read rsakeyFile
        key = OpenSSL::PKey::RSA.new key4pem, passphrase
        cert = OpenSSL::X509::Certificate.new(File.read certFile)

        pdf = PDF.read(file)
        page = pdf.get_page(1)

        # Add signature annotation (so it becomes visibles in pdf document)

        sigannot = Annotation::Widget::Signature.new
        sigannot.Rect = Rectangle[:llx => 89.0, :lly => 386.0, :urx => 190.0, :ury => 353.0]

        page.add_annot(sigannot)

        # Sign the PDF with the specified keys
        pdf.sign(cert, key, 
          :method => 'adbe.pkcs7.sha1',
          :annotation => sigannot, 
          :location => "Portugal", 
          :contact => "email@email.pt", 
          :reason => "Proof of Concept"
        )

        # Save the resulting file
        pdf.save(file.path)
        file
end      

2 个答案:

答案 0 :(得分:0)

我通过使用保存之后解决了这个问题。请参阅我与此主题相关的答案here

答案 1 :(得分:0)

截至今天,您在寻找的内容并不在文档中。您需要创建AWS :: S3 :: Client

我引用:https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/storage/s3.rb#L263

   config.paperclip_defaults = {
      storage: :s3,
      s3_credentials: "#{Rails.root}/config/s3.yml",
      s3_region: ENV['AWS_REGION'],
      s3_protocol: :https,
      s3_options: {
        client: Aws::S3::Client.new(
          access_key_id: ENV['S3_KEY'],
          secret_access_key: ENV['S3_SECRET'],
          http_open_timeout: 10,
          http_read_timeout: 5,
          http_idle_timeout: 20
        )
      }
    }