Либо получите идентификатор, либо корзину, из after_post_process или after_save

Я боролся с этим в течение некоторого времени, и ваша помощь, безусловно, будет очень признательна.

Я создал метод для подписи pdf-документов, который вы можете найти здесь и сейчас я всего в одном шаге от подписания моего файла.

Я хотел бы сделать это асинхронно, но сначала мне нужно понять, как это сделать синхронно.

Поэтому я пробую 2 разных подхода, после post_process :

after_post_process do |receipt|
    if receipt.receipt_file_changed?

      require 'aws-sdk'
          logger.debug("RECEIPT ID: #{self.inspect}")
          file = receipt.receipt_file.queued_for_write[:original]
          s3=AWS::S3.new(
          access_key_id: S3_CONFIG["access_key_id"],
          secret_access_key: S3_CONFIG["secret_access_key"])
          bucket_name = S3_CONFIG["bucket"]

          b = s3.buckets[bucket_name]
          filen = File.basename(file.path)
          outputF = "original/teste.pdf"

          o = b.objects[outputF]
          o.write(file: file.path)

    end
  end

где я хотел иметь возможность отправить файл по пути, например /original/1/myfilename.pdf, где 1 будет моим квитанцией_id (и равен нулю во время пост-процесса).

Затем я попробовал другой подход с after_save, но Recit_file.to_file(:original) не является допустимым вызовом...

after_save do |receipt|
    if receipt.receipt_file_changed?

      require 'aws-sdk'
          logger.debug("RECEIPT ID: #{receipt.inspect}")

          s3=AWS::S3.new(
          access_key_id: S3_CONFIG["access_key_id"],
          secret_access_key: S3_CONFIG["secret_access_key"])
          bucket_name = S3_CONFIG["bucket"]

          b = s3.buckets[bucket_name]
          filen = File.basename(receipt_file_file_name)
          outputF = "original/teste.pdf"

          o = b.objects[outputF]
          o.write(file: receipt.receipt_file.to_file(:original))

    end
  end

Как я могу получить файл и снова загрузить его на S3?

Изменить

После некоторых исследований я прочитал, как мы можем загрузить файл с Amazon, и теперь проблема в том, что содержимое моего файла пусто... Что я делаю не так?

after_save do |receipt|
    if receipt.receipt_file_changed?

      require 'aws-sdk'

          logger.debug("I was here inside after_save")
          s3=AWS::S3.new(
          access_key_id: S3_CONFIG["access_key_id"],
          secret_access_key: S3_CONFIG["secret_access_key"])
          bucket_name = S3_CONFIG["bucket"]

          b = s3.buckets[bucket_name]
          filen = File.basename(receipt_file_file_name)
          logger.debug("Filename is #{filen}")
          path = "original/#{receipt.id}/#{filen}"
          o = b.objects[path]

          require 'tempfile'

          ext= File.extname(filen)

          file = Tempfile.new([File.basename(filen,ext),ext], :encoding => 'ascii-8bit')
          # streaming download from S3 to a file on disk

          begin
            o.read do |chunk|
                file.write(chunk)
            end
          end
          file.close

          logger.debug("File is #{file.inspect}")

          o.write(file: signPdf(file).path)
          file.unlink

    end
  end

person MrWater    schedule 07.09.2012    source источник


Ответы (1)


Разделив эту проблему на части, я заметил, что настоящая проблема заключалась в процессе загрузки и записи на локальный диск. Поэтому я задал этот вопрос, и добрался до обходного пути. В итоге получил этот код для сохранения после:

  after_save do |receipt|
    if receipt.receipt_file_changed? && [email protected]_file.url[".pdf"] 

      require 'aws-sdk'

          s3=AWS::S3.new(
          access_key_id: S3_CONFIG["access_key_id"],
          secret_access_key: S3_CONFIG["secret_access_key"])
          bucket_name = S3_CONFIG["bucket"]

          b = s3.buckets[bucket_name]
          filen = File.basename(receipt_file_file_name)

          path = "original/#{receipt.id}/#{filen}"
          o = b.objects[path]

          require 'open-uri'
          require 'tempfile'

          ext= File.extname(filen)
          tfile = Tempfile.new([File.basename(filen,ext),ext])
          begin
            open(tfile.path,"wb") do |file|
                file << open(receipt.receipt_file.url,:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read
                o.write(file: signPdf(file).path, :acl => :public_read)
            end
          ensure
            tfile.close!
          end

    end
  end
person MrWater    schedule 10.09.2012