文件上傳之后
發(fā)表時(shí)間:2024-06-04 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]大家經(jīng)常會(huì)利用上傳組件上傳文件嗎?你的空間是否足夠大,以至于可以不考慮冗余文件的處理?這里所說(shuō)的冗余文件,是指用戶修改信息或誤操作后,不再與信息關(guān)聯(lián)的文件,久而久之,這些文件會(huì)占用相當(dāng)大的空間。 以下情況可能產(chǎn)生冗余文件: 1.用戶修改了原信息。 用戶可能在修改信息的同時(shí)更換了上傳文件,而被更換的...
大家經(jīng)常會(huì)利用上傳組件上傳文件嗎?你的空間是否足夠大,以至于可以不考慮冗余文件的處理?這里所說(shuō)的冗余文件,是指用戶修改信息或誤操作后,不再與信息關(guān)聯(lián)的文件,久而久之,這些文件會(huì)占用相當(dāng)大的空間。
以下情況可能產(chǎn)生冗余文件:
1.用戶修改了原信息。
用戶可能在修改信息的同時(shí)更換了上傳文件,而被更換的文件留在了服務(wù)器上;
2.用戶在發(fā)布信息過(guò)程中操作失誤,系統(tǒng)提示錯(cuò)誤,用戶返回后,上傳了與原文件不同的文件,原文件留在了服務(wù)器上;
3.刪除信息時(shí)未將與其關(guān)聯(lián)的上傳文件同時(shí)刪除。
為了在以上幾種情況出現(xiàn)時(shí),都將冗余文件處理掉,我采取了一些可能有些繁瑣的辦法,但是為了可憐的空間,繁瑣就繁瑣點(diǎn)吧。以下辦法僅限于利用文件上傳組件的操作,如果是將文件存在庫(kù)里,希望也能有所參考。
先從上傳說(shuō)起
上傳文件可能采取兩種方式:
1.信息入庫(kù)與文件上傳同時(shí)操作;
2.先讓用戶上傳文件,然后信息入庫(kù);
我以前采用過(guò)第一種方法,后來(lái)再做此類功能的時(shí)候放棄了。它雖然可以將上傳文件的相關(guān)信息,如文件個(gè)數(shù),文件名等與信息同時(shí)寫(xiě)入庫(kù)中,但是缺點(diǎn)也很明顯,比如處理中出錯(cuò)的可能性大大增加;允許用戶上傳多個(gè)文件時(shí)需加入多個(gè)<input type=file>循環(huán)處理,一處有錯(cuò),全部重來(lái);如果用戶對(duì)不同文件的顯示位置有要求,處理較困難等等。
采用第二種辦法,可以對(duì)每次上傳單獨(dú)控制,但是需要把上傳的信息如
點(diǎn)擊瀏覽該文件用javascript寫(xiě)回<textarea>,顯示的時(shí)候用UBB處理。我對(duì)js的可靠性不放心,但是魚(yú)與熊掌不可兼得,舍魚(yú)而取熊掌也。
這里插一下對(duì)文件上傳個(gè)數(shù)的控制,有些同學(xué)把上傳個(gè)數(shù)寫(xiě)入庫(kù)表,或用session,我感覺(jué)都不夠靈活,比如用戶修改時(shí),如何使上傳文件個(gè)數(shù)相應(yīng)變化呢?得費(fèi)些功夫。我的辦法是判斷<textarea>中[upload]...[/upload]的個(gè)數(shù),用戶如想修改,從<textarea>刪去欲修改的[upload]...[/upload],可再上傳直至允許的個(gè)數(shù)。
上傳時(shí),文件名一般用上傳時(shí)間加隨機(jī)數(shù)替換,這樣做有兩個(gè)目的,一是保證文件不重名,二是避免文件名中的非法字符造成上傳的文件無(wú)法正確顯示。
但是我把每一篇“文章”中上傳的文件,放在單獨(dú)的一個(gè)文件夾中,文件夾的名字也用時(shí)間加隨機(jī)數(shù)生成,這樣做是為了刪除文件時(shí)便于操作----只要?jiǎng)h掉一個(gè)文件夾就OK了,試想從相對(duì)較少的文件夾找到要?jiǎng)h掉的文件夾,與從一大堆文件中找到要?jiǎng)h除的文件相比,還是要省些功夫的。
下面針對(duì)可能產(chǎn)生冗余文件的操作,介紹我的做法:
1.刪除文件時(shí)。
上面說(shuō)過(guò)了,只要?jiǎng)h掉與信息關(guān)聯(lián)的文件夾就可以了。
但是這個(gè)文件夾要寫(xiě)到庫(kù)表中的,我是這樣做的:在信息發(fā)布的表單中設(shè)一個(gè)<input type=hidden name=filepath>,當(dāng)上傳第一個(gè)文件時(shí),生成文件夾名,[upload]寫(xiě)回<textarea>的同時(shí),文件夾名寫(xiě)回filepath,每次上傳前判斷這個(gè)控件中是否有值,如有,就不再生成文件夾名了。這樣修改信息時(shí),也可以保證文件上傳到原來(lái)的文件夾。
2.修改信息時(shí)。
在用戶修改信息時(shí),前面說(shuō)過(guò),只要?jiǎng)h掉<textarea>中的[upload],就可上傳其它文件,但是原先上傳的(也就是用戶刪掉的[upload]所標(biāo)識(shí)的)那個(gè)文件留在了服務(wù)器上。這時(shí)候,我遍歷filepath下的所有文件(這也是建文件夾的目的之一),判斷每個(gè)文件是否在<textarea>中,如果不在,將其刪除。簡(jiǎn)單的辦法是直接查找<textarea>的字串中是否包含從文件夾中取得的文件名,如果嫌不保險(xiǎn),也可以利用正則表達(dá)式,取得<textarea>中[upload][/upload]中間的文件名,與文件夾中物理存在的文件名比較。
3.信息發(fā)布時(shí)。
用戶在發(fā)布信息時(shí),可能預(yù)覽后對(duì)上傳的文件不滿意,返回去修改,這時(shí)候的操作跟上面一樣,也就是說(shuō),在發(fā)布時(shí)也要比對(duì)filepath中的文件名與<textarea>中的文件名。這樣當(dāng)然會(huì)影響發(fā)布的速度,為了節(jié)省空間,只好以時(shí)間換空間了。
還有一種情況:用戶上傳了文件后,沒(méi)有來(lái)得及發(fā)布,關(guān)掉了瀏覽器,轉(zhuǎn)到了其它頁(yè)面,或是出現(xiàn)其它意外,這時(shí)候會(huì)造成站點(diǎn)空間中存在一個(gè)與任何信息不關(guān)聯(lián)的文件夾。為了處理這種情況,我加了一個(gè)表,在生成文件夾名的同時(shí),將其存入這個(gè)表,信息發(fā)布的同時(shí),再把它從表中刪去。這樣,那些“孤立”的文件夾就會(huì)留在新加的這個(gè)表中,管理員可以每隔一段時(shí)間將表中的文件夾刪除,清理一下這些“孤立”的文件夾。
采用以上辦法,只需要在表中記錄下文件夾名,而不用另外記錄上傳的文件名(文件名存在于信息正文中)。
當(dāng)然,還存在其它的情況,比如在修改時(shí),用戶上傳了新文件,然后關(guān)閉了瀏覽器,這時(shí)候在上傳文件夾中會(huì)出現(xiàn)冗余文件。但是我以上的處理,已經(jīng)使出現(xiàn)冗余文件的可能性大大減小了,如果您覺(jué)得有必要,可以進(jìn)行更細(xì)致,同時(shí)也是更繁瑣的處理:)