Я боролся с этим в течение некоторого времени, и ваша помощь, безусловно, будет очень признательна.
Я создал метод для подписи 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