2012-09-10 2 views
1

J'essaie d'utiliser aws-sdk pour charger des fichiers s3 sur un disque local, et je me demande pourquoi mon fichier pdf (qui a juste un texte disant SAMPLE PDF) se révèle avec un contenu apparemment vide.Utiliser aws-sdk pour télécharger des fichiers à partir de s3. Encodage pas correct

Je suppose que cela a quelque chose à voir avec l'encodage ... mais comment puis-je le réparer?

Voici mon code:

require 'aws-sdk' 

bucket_name = "****" 
access_key_id = "***" 
secret_access_key = "**" 

s3=AWS::S3.new(
access_key_id: access_key_id, 
secret_access_key: secret_access_key) 

b = s3.buckets[bucket_name] 
filen = File.basename("Sample.pdf") 

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

require 'tempfile' 

ext= File.extname(filen) 

file = File.open("test.pdf","w", encoding: "ascii-8bit") 
# streaming download from S3 to a file on disk 

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

Si je prends le encoding: "ascii-8bit", je viens d'obtenir un message d'erreur Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

+2

Lorsque vous ouvrez le fichier, essayez d'utiliser "wb" (écriture + binaire) au lieu de seulement "w". –

Répondre

3

Après quelques recherches et une pointe d'un cousin à moi, j'ai finalement obtenu ce travailler. Au lieu d'utiliser la solution aws pour charger le fichier d'amazon et l'écrire sur le disque (qui générait un fichier pdf étrange: apparemment égal à l'original, mais avec un contenu vide, et Adobe Reader "fixant" le lors de l'ouverture je préfère utiliser open-uri, avec SSL ignorer.

Voici le code final qui a fait ma journée:

require 'open-uri' 
open('test.pdf', 'wb') do |file| 
    file << open('https://s3.amazon.com/mybucket/Sample.pdf',:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE).read 
end 
+3

C'est le drapeau 'b' qui me manquait lors de l'ouverture du fichier! Merci beaucoup! – awendt

Questions connexes