4

Rails アプリでは、URI を解析する必要があります

a = 'some file name.txt'
URI(URI.encode(a)) # works

b = 'some filename with :colon in it.txt'
URI(URI.encode(b)) # fails URI::InvalidURIError: bad URI(is not URI?): 

特殊文字を含む URI にファイル名を安全に渡すにはどうすればよいですか? コロンでエンコードが機能しないのはなぜですか?

4

5 に答える 5

12

URI.escape(またはencode) は、オプションの 2 番目のパラメーターを取ります。これは、エスケープする必要があるすべての記号に一致する正規表現です。単語以外のすべての文字をエスケープするには、次を使用できます。

URI.encode('some filename with :colon in it.txt', /\W/)
#=> "some%20filename%20with%20%3Acolon%20in%20it%2Etxt"

には、次の 2 つの定義済み正規表現がありますencode

URI::PATTERN::UNRESERVED  #=> "\\-_.!~*'()a-zA-Z\\d"
URI::PATTERN::RESERVED    #=> ";/?:@&=+$,\\[\\]"
于 2013-08-21T18:55:10.467 に答える
2
require 'uri'

url = "file1:abc.txt"
p URI.encode_www_form_component url

--output:--
"file1%3Aabc.txt"


p URI(URI.encode_www_form_component url)

--output:--
#<URI::Generic:0x000001008abf28 URL:file1%3Aabc.txt>


p URI(URI.encode url, ":")

--output:--
#<URI::Generic:0x000001008abcd0 URL:file1%3Aabc.txt>

コロンでエンコードが機能しないのはなぜですか?

エンコード/エスケープが壊れているためです。

于 2013-08-21T20:09:26.387 に答える
0

問題は、コロンの前の空のスペースにあるようです。機能'lol :lol.txt'しませんが、'lol:lol.txt'機能します。
たぶん、スペースを別のものに置き換えることができます。

于 2013-08-21T18:49:56.433 に答える
0

使用するAddressable::URI::encode

require "addressable/uri"

a = 'some file name.txt'
Addressable::URI.encode(Addressable::URI.encode(a))
# => "some%2520file%2520name.txt"

b = 'some filename with :colon in it.txt'
Addressable::URI.encode(Addressable::URI.encode(b)) 
# => "some%2520filename%2520with%2520:colon%2520in%2520it.txt"
于 2013-08-21T18:50:26.190 に答える
-1

指定された文字列から特殊文字をエスケープする場合。使用するのが最善です

esc_uri=URI.escape("String with special character")

結果の文字列は URI エスケープ文字列であり、安全に URI に渡すことができます。URI エスケープの使用方法については、 URI::Escapeを参照してください。お役に立てれば。

于 2013-08-21T18:50:03.090 に答える