遇到一個需求是要使用 Canvas 合成兩張圖片,並保存在Server 端…
步驟
- 將合成好的 Canvas 圖片利用 toDataURL() 轉成編碼
POST 到後端
在這裡會遇到一個問題是資料長度格式太大,因為 body-parser 模組默認的大小為 100kb
合成完的圖片已目前的經驗就算是隨便亂撇一張圖都超過了…,這時候只需要把大小放寬為 50mb 就可以正常 POST 到後端1
2
3
4
5
6
7
8app.use(bodyParser.json({ limit: "50mb" }));
app.use(
bodyParser.urlencoded({
limit: "50mb",
extended: true,
parameterLimit: 50000
})
);接著把傳到後端的格式資料處理
toDataURL() 會產生data:image/png;base64,Xfgtjgm123fddsfsdf.....
的格式,必須把前段的data:image/png;base64,
過濾掉
然後在寫入檔案就完成了,下面是 source code1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 過濾 toDataURL 傳到後端的資料
function decodeBase64Image(dataString) {
var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/),
response = {};
if (matches.length !== 3) {
return new Error("Invalid input string");
}
response.type = matches[1];
response.data = new Buffer(matches[2], "base64");
return response;
}
// 寫入檔案
function Write() {
let imageBuffer = decodeBase64Image(req.body.data);
fs.writeFile("test.jpg", imageBuffer.data, function(err) {
console.log("success");
});
}
延伸
- 檔案名稱
- 存檔案的路徑
這些都可能有各自的考量就不多做紀錄
最後
後期提出需求是要合成 .gif 的圖片,讓我們有點頭大
想法是 .gif 的檔案是存在於後端 Server 上,前端只需要給”上傳的圖片”以及”位置”
在後端再組合圖片,應該就可以解決在傳遞過程資料量又更大的問題