如果架一個沒有太多限制的上傳下載的網頁空間,那麼全世界就會拿來作暫存的空間來供互傳。避免這樣的問題,最簡單的方案是利用 web server 的設定及簡單的 script ,可符合部份需要。以這個經驗基礎,來規畫如何以 RoR 來改寫所需的功能。
需求源起
早期 mail server 的每封信最大容量限制,普遍是 1~2 MB左右,夾帶檔案一大就寄不出,所以會有網頁暫存空間的需求,那時候還沒有像 rapidshare 那樣的快而大容量的網站;而印象中最早所知道可以上傳大檔案到 http://www.yousendit.com/,然後 mail 給對方該檔的下傳網址,這種網站還不普及時,以一開始就用http://www.clearlight.com/pub/upload/file-upload.cgi這個 script 來作為單位內外上傳用;然而在沒區分單位內外是否可上傳下載的限制時,網站就流量大增,反而都不是自己單位內來上傳或下載用,而從 http referer 來看,變成許多其他討論區的貼圖圖床或檔案分享空間的所在。
上傳下載的原則
當時並想不到可以有像 rapidshare 這樣偉大網站的概念,只想趕快做限制,然後透過 apache 設定限制允許的範圍存取目錄來畫分三個目錄區,分別是:
1.單位內上傳,只可單位內下載
2.單位內上傳,可讓全世界下載
3.全世界可上傳,但只能給單位內下載
下載區及放 cgi 的所在,就用 apache 的設定來限制 ip 的存取範圍:
<Directory "/home/ironman/htdocs/COMPANYonly">
Options Indexes FollowSymLinks MultiViews
AuthUserFile .htaccess
AllowOverride All
Order deny,allow
Deny from all
Allow from 192.168.xxx
</Directory>
而 script 方面也是放在兩個目錄,供單位用的目錄也設成只有內部可存取。
修改 script 檔
但原始的上傳位置是固定的,就試著讓每天上傳在該日的目錄,這樣要刪舊檔就只要把某日期的子目錄刪除就可以了。以下是根據上述的 script 所增加的一些設定
...
BEGIN {
$directory = `date \+\%Y\%m\%d`;
chomp $directory ;
$today = "$directory";
use CGI qw(:standard);
$query = new CGI;
$whichdir = $query->param('target');
if ($whichdir =~ m/orgonly/ ) {
$realdirectory = "/home/改這裡/htdocs/orgonly/$directory";
} else {
$realdirectory = "/home/改這裡/htdocs/2world/$directory";
}
if (!(-e $realdirectory))
{
mkdir ("$realdirectory",0755) || die "Couldn't make $realdirectory directory\n";
$readmefile = "/home/改這裡/htdocs/orgonly/README.html";
open(RF,"$readmefile");
@readme=<RF>;
close(RF);
open(RM,">$realdirectory/README.html");
print RM @readme;
close(RM);
}
# $SAVE_DIRECTORY = "/home/ftp/upload";
...
這樣就可以把每天的檔案,上傳到當日的目錄中;將整個修改過的檔案放在http://upload.singernew.org/dl/up_cgi.txt可下載放在cgi的目錄使用,而可以用http://upload.singernew.org/dl/HEADER_html.txt放在 apache 的目錄中,並有啟用 autoindex 的功能,就會將這 HEADER.html 秀在最上面,而這 HEADER.html 就有了上傳的表單,以及選擇要上傳給只有單位下載或者是給全世界下載的選項。
用 RoR 改寫的目標
這樣的 script 也用了好幾年,隨時在外地剛好有東西要存起來,就敲個網址,就上傳上來,如果信任內部環境的話,丟到內部裡也不怕外面看,而且也不用在外地要在別人的電腦上敲自己的帳號密碼,來進入自己的信箱而再傳;這是快速及安全的考量而言。若有檔案存在隨身碟怕掛掉的話,放在自己可存取的網址,也是個好的備援方式。
所以這上傳下載的機制,除了具有上述舊 script 的功能外,可以不需帳號密碼的限制就可上傳,而上傳者又可為其檔案設定密碼,而這有這密碼才可以下載該檔案,以及下載之後去刪除該檔案。
換句話說,單位內可下載全部檔案,除了有設密碼之外;而上傳的檔案可設或不設密碼,也可選擇是否給外界下載。而單位外,只能下載單位內部丟出來的檔案,不管要不要密碼;而上傳的檔案可設或不設密碼,而且只有單位內可下載。
接下來將利用第11日的基礎,以及結合第3日的資料庫操作的運用來建置這供單位內外用的暫存系統。