base64エンコード・デコード
文字しか貼れない掲示板・日記などにバイナリデータを記録する方法として、base64でエンコード・デコードするcgiがあると便利だと思った。
ファイルをbase64でエンコードするCGI(by Ruby)
encode.html
<html> <body> <form action="encode.cgi" method="POST" enctype="multipart/form-data"> <div> <input type="file" name="senddata" size="60"> </div> <input type="submit" value="Encode"> </form> </body> </html>
encode.cgi
#!/usr/local/bin/ruby require 'base64' require "cgi" print "Content-type: text/html\n\n" cgi = CGI.new value = cgi['senddata'] data = value.read base64 = [data].pack('m') filename = value.original_filename.gsub("\\", "/") filename = File.basename(filename) print <<END <pre> Content-Type: application/octet-stream; name="#{filename}" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="#{filename}" #{base64} </pre> END
ファイルをbase64でデコードするCGI(by Ruby)
decode.html
<html> <body> <form action="decode.cgi" method="POST"> <div><textarea name="senddata" cols=70 rows=30></textarea></div> <input type="submit" value="decode"> </form> </body> </html>
encode.cgi
#!/usr/local/bin/ruby require "cgi" require "base64" require "stringio" cgi = CGI.new value = cgi["senddata"] stio = StringIO.new(value) conatin_type = stio.readline.chop conatin_encoding = stio.readline.chop conatin_disposition = stio.readline.chop base64data = String.new stio.each{ |l| base64data << l } print conatin_type + "\n" print conatin_disposition + "\n\n" STDOUT.write(decode64(base64data))
おまけ。
decode.cgiのPHP3実装。
<?php $value = $HTTP_POST_VARS["senddata"]; $starry = split("\n", $value); $conatin_type = $starry[0]; $conatin_encoding = $starry[1]; $conatin_disposition = $starry[2]; $base64data = ""; for($i=3; $i<count($starry); $i++){ $base64data = $base64data. "\n". $starry[$i]; } header($conatin_type); header($conatin_disposition); header("\n"); print(base64_decode($base64data)); ?>