こんなエラーメッセージが返ってきます
s3をrubyなどで操作しようとしたとき、または、ブラウザからアクセスしようとしたときに、エラーで開けないときがあります。
例えば、Terminalからだと、こんなエラーが返ってきます。
Illegal character '' in raw string "hoge/foo.pdf"
Line: 2
Position: 1256
Last 80 unconsumed characters:
</Key>
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:20:in `parse'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:245:in `build'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:7:in `new'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:7:in `rexml_document'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/parser.rb:22:in `parse_list_bucket_result'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/bucket.rb:147:in `list_bucket'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/s3-0.3.13/lib/s3/bucket.rb:113:in `block in objects'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:57:in `call'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:57:in `proxy_target'
from /usr/local/var/rbenv/versions/1.9.3-p429/lib/ruby/gems/1.9.1/gems/proxies-0.2.1/lib/proxies/proxy.rb:61:in `method_missing'
from s3.rb:17:in `<main>'
…続く
なんて感じで返ってきて、どうやら、ファイル名にillegal characterが含まれていることがわかります。
エラーメッセージを活かしたスクリプト
# encoding: utf-8
require 's3'
key = 'あなたのkey'
secret = 'あなたのsecret_key'
bucket_name = 'バケット名'
path = 'hoge/foo.pdf'
service = S3::Service.new(:access_key_id => key,
:secret_access_key => secret)
bucket = service.buckets.find(bucket_name)
obj = bucket.objects.find(path)
obj.destroy
こんな感じでエラーメッセージ内のpathを使って消そうとします。
すると消せません。
消し方
結論から言えば、
ill_path = "hoge/\x10foo.pdf"
のように、

を
\x10
に変えてあげればpathとして機能します
つまり、こんなスクリプトでイケます。
# encoding: utf-8
require 's3'
key = 'あなたのkey'
secret = 'あなたのsecret_key'
bucket_name = 'バケット名'
ill_path = "hoge/\x10foo.pdf"
service = S3::Service.new(:access_key_id => key,
:secret_access_key => secret)
bucket = service.buckets.find(bucket_name)
obj = bucket.objects.find(ill_path)
obj.destroy
おしまい