fs 文件操作
文件操作
require("fs");1.複製文件
創建一個class2.js檔案
在class.js輸入:
fs = require("fs");
function copy(src, target) {
console.log(target);
fs.writeFileSync(target, fs.readFileSync(src));
}
copy("./class1.js","./class2.js");但這樣的寫法容易產生內存溢出,以及同步阻塞
可改成
class.js
fs = require("fs");
function copy(src, target) {
fs.createReadStream(src).pipe(fs.createWriteStream(target));
};
copy("./class1.js","./class2.js");2.同步讀取文件
3.同步寫入文件
發現class2.js整個文件變成abc,如果我只想讓abc附加在文件後呢?
改為appendFileSync
4.判斷路徑是否存在
exists(path, callback)
5.移除檔案
先新建一個class3.js
發現class3.js被移除了
6.移除資料夾
先新建一個名為class3的資料夾
7.創建資料夾
但不知道第二個參數是什麼意思,他是指檔案權限的意思,但檔案權限是什麼意思?
下面講一下檔案權限
8.readFile是異步的
多嘗試幾次,發現console的讀取順序不固定 9.同步讀取
10.讀取目錄內檔案
會返回一個檔案名稱產生的陣列
11.查看檔案詳細資訊
fs.stat(path, callback)
12.監聽文件
watchfile(),unwatchfile()
執行node class後在class1.js寫上東西後按儲存即會在console顯示訊息
13.createReadStream
createReadStream方法往往用於打開大型的文本文件,創建一個讀取操作的數據流。所謂大型文本文件,指的是文本文件的體積很大,讀取操作的緩存裝不下,只能分成幾次發送,每次發送會觸發一個data事件,發送結束會觸發end事件。
會發現得到的是一個buffer
加上後轉為string
另外
為什麼要有buffer?
fs.utimes
其他可參考下面文章
讀取出所有資料夾內的資料夾
不使用第三方模組解析上傳檔案
第三方模組 e.g. formidable, body-parser
index.html
server.js
這邊從 utf8 buffer array 轉為string 可參考 https://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript
但之後會發現檔案太大還是會 browser crash,大約 4mb以上,所以還是要用form/data來傳,並用 formidable 解析,如果不用其他模組仍可解析,但要自己parse ------WebKitFormBoundary 內的內容
因為 form/data 可以直接傳入 file input 的 files[0] 類行為 blob,但如果要用 post 必須在 body 傳入 arraybuffer,如果太大會導致 browser crash
上傳 file 轉為 stream
假設檔案長這樣

此時可用
將其轉為 stream 然後上傳到 minio 或 S3 之類地方。
將檔案從server 傳到 client
1.可用 express 之 res.download('檔案路徑')
或是使用
在前端部分可以如下下載檔案
前端取得上傳檔案進度
axios 取得上傳進度
Fetch API 目前還無法取得上傳進度
大檔案切片上傳
在前端把檔案切分,分成多的請求上傳,然後在後端合併。
clone 之後進入範例:resumable.js/samples/Node.js
然後把這幾個部分改一下:
前端
後端
app.js has been tweaked to send resumable a directory where to save the file (top most).
tweaked app.js to change the content of app.post('/uploads',...) see gist.
https://stackoverflow.com/a/35137586/4622645
產生大檔案
1024 or 1000
https://stackoverflow.com/questions/8632269/displaying-file-size-1000b-1kb-or-1024b-1kb
Last updated
Was this helpful?