筆記:用curl上傳檔案

 這篇彙整一下用curl測試上傳檔案,驗證伺服端使用node.js。

之前也有用node.js寫過伺服端,不過那時沒有用curl做測試


1. 表單上傳

使用 -F, --form表單enctype為‵multipart/form-data‵上傳檔案

curl -F "fieldName=curl" -F uploadfile=@"multiple-class.png" http://localhost:3000

留意:檔名中包含','或';'要用雙引號處理,還有些bash行為要注意

2. 串流上傳檔案

使用 --data-binary 上傳檔案

curl -H 'Content-Type: application/octet-stream' --data-binary @"multiple-class.png" http://localhost:3000

應用:使用IoT大平台語音辨識/語音轉文字(STT)功能

3. 用PUT上傳檔案

使用 -T, --upload-file 傳檔案會使用PUT而不是POST

curl -T "multiple-class.png" http://localhost:3000

4. 多檔序列上傳

curl -T "img[1-1000].png" http://localhost:3000
curl --upload-file "{file1,file2}" http://localhost:3000

5. 表單傳送鍵值

使用 -d, --data, --data-ascii表單enctype為‵application/x-www-form-urlencoded‵上傳檔案

curl -d "fieldName=curl" -d uploadfile=multiple-class.png http://localhost:3000

實測-d無法用來傳檔案,只會傳鍵值。

6. 純文字傳送成功,但是二進位檔案到伺服端會有問題的方式

curl -d "fieldName=curl" --data-urlencode uploadfile@"multiple-class.png" http://localhost:3000
curl -d "fieldName=curl" --data-urlencode uploadfile@"blog.txt" http://localhost:3000

會把檔案用urlencode也就是percentage encoding。實測上傳binary內容會不正常,Text正常。


測試用伺服端 用Node.js 的 Express

index.js

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.urlencoded({ extended: false })); //[Deprecated] app.use(express.urlencoded());

app.get('/', (req, res, next) => {
res.send(`<form method="POST" action="/" enctype="multipart/form-data">
<input type="text" name="fieldName" placeholder="username">
<input type="file" name="uploadFile" placeholder="choose">
<input type="submit">
</form>`);
});

app.post('/', function (req, res, next) {
res.send(JSON.stringify(req.body));
});

app.put('/put/:filename', function (req, res) {
let filename = req.params.filename;
console.log('put', filename);
res.send(JSON.stringify(req.body));
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log('Port:', PORT));

package.json

{
"scripts": {
"start": "node index.js"
},
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1"
}
}

參考資料

https://rammusxu.github.io/2016/04/06/nodejs-multer-file-upload-module/

留言