2012-09-10 89 views
1

我想使用aws-sdk將s3文件加載到本地磁盤,並質疑爲什麼我的pdf文件(它只是有一個文本說明SAMPLE PDF)結果顯然是空的內容。使用aws-sdk從s3下載文件。編碼不正確

我想這與編碼有關......但我該如何解決它?

這裏是我的代碼:

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 

如果我參加了encoding: "ascii-8bit",我只是得到一個錯誤信息Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

+2

當您打開文件時,請嘗試使用「WB」(寫+二進制),而不是唯一的「W」。 –

回答

3

一些研究,並從我的一個表弟舉報後,我終於得到這個上班。

而不是使用aws解決方案從亞馬遜加載文件,並將其寫入磁盤(這正在生成一個奇怪的pdf文件:顯然與原來相同,但與空白內容,Adobe Reader「修復」時打開) 我改用open-uri,而忽略SSL。

這裏是一個讓我很快樂的最終代碼:

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

這是打開文件時丟失的'b'標誌!非常感謝! – awendt