2008年6月10日火曜日

uploader cgi

知り合いにこないだの写真送ってとメールしたら、CD-Rで送るねと返信が来た。いやいや、オンラインで頼むよといったらオーバーフローしてしまったようだ。説明するのはめんどくさいので自宅のサーバにuploaderを置いて、ここにアップロードして!と頼むことにした。

そんな感じでコードは下に。ダウンロード用のリンクはあえて作ってない。悪意のあるファイル名を入力されたら不安だけど、まぁ大丈夫でしょう…。これより凝ったことしようと思ったらrailsかな。
#!/usr/bin/env ruby
require 'cgi'
require 'kconv'
DataDir='data'
MaxSize=250*1024*1024
StoreLimit=20*1024*1024*1024
PageTitle='file uploader'

def commify(numstr)
int, frac = *numstr.split('.')
int = int.gsub(/(\d)(?=\d{3}+$)/,'\\1,')
int << '.' << frac if frac
return int
end

cgi=CGI.new

print cgi.header("type"=>"text/html", "charset"=>"Shift_JIS")
puts '<html>'
puts '<head>'
puts "<title> #{PageTitle} </title>"
puts '</head>'
puts '<body>'
puts "<h1>#{PageTitle}</h1>"

fb = Dir.glob(DataDir+'/*')
total=0
if fb.length > 0
fb.each{|f|
total+=File.stat(f).size
}
end

if (cgi['file'] != "")
file = cgi['file'].original_filename.chomp
if file.length>0
file = file.toutf8
file.gsub!(/\\/,'/')
file.gsub!(/\s/,'_')

if total+cgi.content_length>StoreLimit
print 'sorry. disk full. cannot upload the file.'
elsif cgi.content_length<MaxSize
ofn = sprintf("%s/%d.%s.%s",DataDir,$$,Time.now.to_f.to_s,File.basename(file))
begin
f = open(ofn,"wb")
rescue
print 'upload failed with unexpected error. please contact to server administrator.'
else
f.write cgi['file'].read
print 'upload succeessfully completed: '
print file.kconv(Kconv::SJIS,Kconv::UTF8)
ensure
f.close
end
else
print 'filesize error. you can upload up to '+MaxSize.to_s+'Bytes'
end
print '<hr />'
end
end

puts '<form method="POST" enctype="multipart/form-data">'
puts 'file: <input type="file" name="file" size="50">'
puts '<input type="submit" name="upload" value="upload">'
puts '</form>'
puts '<hr>'

files = Dir.glob(DataDir+'/*')
if files.length > 0
puts 'uploaded files:<br />'
puts '<table border=4>'
print '<tr><th>'
print 'date uploaded'
print '</th><th align=right>'
print 'file name'
print '</th><th align=right>'
print 'bytes'
puts '</th></tr>'
files.each{|f|
s = File.stat(f)
print '<tr><td>'
print s.ctime
print '</td><td align=right>'
print CGI.escapeHTML(f.sub(/\A#{DataDir}\/[0-9]+\.[0-9]+\.[0-9]+\./,'').kconv(Kconv::SJIS,Kconv::UTF8))
print '</td><td align=right>'
print commify(s.size.to_s)
puts '</td></tr>'
}
puts '</table>'
else
puts 'no files uploaded'
end

puts '<a href="./"> refresh </a>'
puts '</body>'
puts '</html>'

0 件のコメント: