最近在學習node,想做一個簡單的網站。首先想到的是上傳文件的功能,查了下,發現有一個formidable模塊,操作方便,便拿來嘗試了一下,結果很糾結。
下載安裝的就不用說了,用npm即可。說一下,自己遇到的問題吧,mark一下,防止再犯。
當然,使用的例子也是最廣泛的,即官網上的那個,懶,就不在此貼上了。。。。還有,我用的是html是jade
首先是沒有給上傳文件的input標簽添加name屬性,導致它的files域為空,從正常的結果來看,files是以file的name為對象的集合。

還有需要注意的是res.writeHead(200,{'content-type':'text/plain;charset=utf-8'});,否則返回中文等顯示亂碼,切記中中間的是分號(綠色),html菜鳥飄過。。。
還有就是上傳路徑的指定。如果沒有指定路徑的話,文件會被上傳到電腦默認的臨時文件夾下面(我的在c:/user/admin/appdata/local/temp下)。起初,我設定的路徑入下:
form.uploadDir = "/temp";
這個temp是需要先在項目中創建好的。
PS:名字起得太有爭議了,和系統文件夾名字重名了,不過也讓我了解多了些問題本質,\(^o^)/~
在上圖可以看到它的path顯示,在我的電腦上找,原來是被存放到系統盤C:\TEMP。本來認為的是文件會被存入到項目根目錄下的temp文件夾中,卻忽略了/temp是根目錄的表示。。。於是,添加一個"."來表示當前目錄,也就是項目的路徑。form.uploadDir = "./temp";果然,在項目的temp下,真的出現了上傳文件,可惜名字無法辨別。。。雖然path顯示的和以前的差不多,不過此temp非彼temp。。。我們可以看到,前者前面帶有“\\”表示根目錄即絕對路徑,后者以“temp”開始,表示相對路徑。
下面便是想改個名字,以方便以后對文件進行操作。
改名字的話就要用到fs模塊了,對文件進行操作嘛。
var fs = require('fs')
在相應的函數里面加上下面這句:
fs.renameSync(files.upload.path,"change.txt");
首先,我是不清楚它的原理,大概的意思是猜它將重命名上傳路徑上文件的名字,我想將文件名稱改為change.txt。結果呢,文件是被重命名了,不過它卻出現在項目的根目錄下面,不明白。。。
返回的信息也是顯示如上圖的信息,path還是temp加上一長串,這表示,我錯了。
再次嘗試,fs.renameSync(files.upload.path,"./temp/change.txt");其實,這我也該想到了,前一個參數是文件名稱的全稱包含它的路徑,所以我們改的話也是要加上它的目標路徑的(相對路徑,不然又要到系統里的temp找了),而不只是它的名字。本次的結果是正確的,在項目的temp下,出現change.txt文件,但是返回的信息還是temp加一個長串字符,這樣,我們也該知道,這是它原生態的名字,而不是我們改過后的。