0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

s3でillegal characterが含まれたpathがあるためにエラーが発生する

Posted at

こんなエラーメッセージが返ってきます

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/&#x10;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;
を
\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

おしまい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?