絵を描いたりネットいろいろ
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Ruby-CGI-uploder 作り 2


前回のソースコードからやったことは3つ
ファイルサイズを、とりあえず100kByteに制限
例外を使って処理をまとめた
アップロードできる拡張子を、jpgとpngに制限



#!/usr/local/bin/ruby
require 'cgi'
print "Content-type: text/html\n\n";

print <<-TEXT
<html><head><title> test_uploder </title></head>
<body>
<form method="POST" enctype="multipart/form-data">
file <input type="FILE" name="file">
<input type="submit" value="upload">
</form>
</body></html>
TEXT
#------------------------------------------------------------
folder = "cgi_up"

cgi = CGI.new
value = cgi.params["file"].first
begin
raise "file to nil" if value.nil?
raise "kakutyousi_err" unless File.extname( value.original_filename ) =~ /\.jpg$|\.png$/
raise "size over" if 100_000 < value.size

mkfile = Dir.getwd + "/#{folder}/" + value.original_filename.gsub(/[^\w!\#$%&()=^~|@`\[\]\{\};+,.-]/u, '_')
open( mkfile , "wb") do |f|
f.write value.read
end
print "upload is " , mkfile
rescue => ev
print ev
end

print '<hr color="#88ccaa" size="5" width="350" align="left">'

Dir["#{folder}/*.{jpg,png}"].each.each_with_index do | m , i |
size = File.size m
m = File.basename m
print "<img src='#{folder}/#{m}' height='200'> "
# print "#{i} _ <a href=#{folder}/#{m}>#{m}</a> _ #{size} byte <br>\n"
end






ちょっと、いくつか勝手に画像使わせていただきました

conp_cgi1_r.jpg



あとは
ファイルの削除機能とリロード?を、つけてみる
delete_numのところに数字を入れてdeleteを押すと削除される



#!/usr/local/bin/ruby
require 'cgi'
print "Content-type: text/html\n\n";

print <<-TEXT
<html><head><title> test_uploder </title></head>
<body>
<form method="POST" enctype="multipart/form-data">
file <input type="FILE" name="file">
<input type="submit" value="upload">
</form>
<form method="POST" enctype="multipart/form-data">
delete_num <input type="input" name="del_file">
<input type="submit" value="delete">
</form>
<a href="#{File.basename __FILE__}"> reload </a>

</body></html>
TEXT
#------------------------------------------------------------
folder = "cgi_up"

cgi = CGI.new
value = cgi.params["file"].first
begin
raise "file to nil" if value.nil?
raise "kakutyousi_err" unless File.extname( value.original_filename ) =~ /\.jpg$|\.png$/
raise "size over" if 300_000 < value.size

mkfile = Dir.getwd + "/#{folder}/" + value.original_filename.gsub(/[^\w!\#$%&()=^~|@`\[\]\{\};+,.-]/u, '_')
open( mkfile , "wb") do |f|
f.write value.read
end
print "upload is " , mkfile
rescue => ev
print ev
end

print " _ "

value = cgi.params["del_file"].first
begin
raise "" if value.nil?
file = Dir["#{folder}/*.{jpg,png}"][ value.to_i ]
raise "delete_err" if file.nil?
File.unlink file
puts "delete is " , file
rescue => ev
print ev
end


print '<hr color="#88ccaa" size="5" width="350" align="left">'

Dir["#{folder}/*.{jpg,png}"].sort do | a , b |
File.mtime(b) <=> File.mtime(a)
end.each_with_index do | m , i |
size = File.size m
m = File.basename m
print "<img src='#{folder}/#{m}' height='200'> "
print "#{i} _ <a href=#{folder}/#{m}>#{m}</a> _ #{size} byte <br>\n"
end





また少々画像を使わせていただいています

conp_cgi2_r.jpg



他にやったことは、ファイルの更新日時順に並べたり、とかですね

このアプロダにあと足りない機能は、
ファイルが一定数を超えたら、古いものから削除していく機能だけど

そういうのは、ここにかくよりも、
別プロセスでスケジュールたてるとか
サーバー起動時に別スレッドを起動しておくとかで



n = Dir["#{folder}/*.{jpg,png}"].size - 50

if n > 0
Dir["#{folder}/*.{jpg,png}"].sort do | a , b |
File.mtime(b) <=> File.mtime(a)
end.reverse.take( n ).each do | m |
File.unlink m
end
end



定期的にこんな感じのスクリプトを実行してやったりする手もあります
べつにアップロードされすぎて容量いっぱいになったら
どうせHDDへ書き込みをしようとしたときに、エラーが出るはずなので
パソコンが壊れたりすることはありません



ruby uploader の作成でした  終
    0..

kakikomi