Я использую gem Libreconv для преобразования слова в документ, но он не работает с S3
bucket = Aws::S3::Bucket.new('bucket-name') object = bucket.object file.attachment.blob.key path = object.presigned_url(:get) Libreconv.convert(path, "public/test.pdf")
Если я пытаюсь преобразовать этот путь в PDF с помощью Libreconv, то это приводит к слишком длинной ошибке в имени файла.Я написал этот код под ActiveJobs.Так что любезно предоставьте мне решения в соответствии с ActiveJobs.
Может кто-нибудь предложить мне, как я могу преобразовать файл Word в PDF.Здесь путь - https://domain.s3.amazonaws.com/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9
https://domain.s3.amazonaws.com/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9
, а ошибка, которую я получаю, -
Error: source file could not be loaded *** Errno::ENAMETOOLONG Exception: File name too long @ rb_sysopen - /tmp/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9.pd
ниже приводится ответ с использованием комбината pdf gem
tape = Tape.new(file) result = tape.preview tempfile = Tempfile.new(['foo', '.pdf']) File.open(tempfile, 'wb') do |f| f.write result end path = tempfile.path combine_pdf(path)
и для загрузки файла для S3 я использовал
object = @bucket.object object_key path = object.presigned_url(:get) response = Net::HTTP.get_response(URI.parse(path)).body
Похоже, что ваш PDF создан со всеми параметрами, необходимыми для извлечения документов из S3.
Я полагаю, это происходит в этой строке :
target_tmp_file = "#{target_path}/#{File.basename(@source, ".*")}.#{File.basename(@convert_to, ":*")}"
@source равно https://domain.s3.amazonaws.com/Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9 и
@source
> File.basename(@source, ".*") => "Bf5qPUP3znZGCHCcTWHcR5Nn?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIZ6RZ7J425ORVUYQ%2F20181206%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20181206T051240Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=b89c47a324b2aa423bf64dfb343e3b3c90dce9b54fa9fe1bc4efa9c248e912f9"
В результате Libreconvgem пытается создать файл tmp с этим длинным именем, и он слишком длинный - вот почему возникает ошибка.
Возможное решение: разделить процесс на отдельные этапы получения файла и его конвертации.Что-то вроде:
require "open-uri" bucket = Aws::S3::Bucket.new('bucket-name') object = bucket.object file.attachment.blob.key path = object.presigned_url(:get) doc_file = open(path) begin Libreconv.convert(doc_file.path, "public/test.pdf") ensure doc_file.delete end