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));
?>