1

ユースケースの例では、 の内容をファイル名としてコンピューターに保存http://example.comしますが、安全でない文字 (つまり:/) はエスケープされています。

古典的な方法は、正規表現を使用して、英数字、ダッシュ、アンダースコア以外のすべての文字を取り除くことですが、そうすると、ファイル名を URL に逆にすることができなくなります。CGI.escapeWindows と *nix の両方のファイル名をサニタイズする方法 (おそらく と別のフィルターの組み合わせ) はありますか? トレードオフがはるかに長いファイル名であっても?

編集:

CGI.escape

 CGI.escape 'http://www.example.com/Hey/whatsup/1 2 3.html#hash'
 #=> "http%3A%2F%2Fwww.example.com%2FHey%2Fwhatsup%2F1+2+3.html%23hash"

いくつかのこと...%記号はファイル文字として完全に安全ですか? 残念ながら、CGI.escapeは不正な形式の URL のスペースを最初のパスで に変換しません%20。そのため、どの翻訳方法でも、すべてのスペースを に変更してから適用する必要がある+思いgsubます。CGI.escape

4

2 に答える 2

3

方法の 1 つは、ファイル名を「ハッシュ」することです。たとえば、この質問の URL は次のとおりhttps://stackoverflow.com/questions/18234870/how-to-reversibly-escape-a-url-in-ruby-so-that-it-can-be-saved-to-the-file-systeです。Ruby 標準ライブラリのdigest/md5ライブラリを使用して名前をハッシュできます。シンプルでエレガント。

require "digest/md5"

foldername = "https://stackoverflow.com/questions/18234870/how-to-reversibly-escape-a-url-in-ruby-so-that-it-can-be-saved-to-the-file-syste"
hashed_name = Digest::MD5.hexdigest(foldername) # => "5045cccd83a8d4d5c4fc01f7b4d8c502"

このスキームの当然の帰結は、すべての実際的な目的のために、文字列の MD5 ダイジェストは常に同じ 16 進文字列を返すため、MD5 ハッシュを使用してダウンロードの信頼性/完全性を検証することです。

ただし、これを「リバーシブル」とは呼びません。生成される各ハッシュの URL を検索するカスタムの方法が必要です。.ymlそのデータを含むファイルかもしれません。


更新: @the Tin Man.ymlが示唆するように、格納する必要があるファイルが多数ある場合、単純な SQLite db はファイルよりもはるかに優れています。

于 2013-08-14T15:27:33.670 に答える