ユーザーがアップロードした画像から取得したバッファーがあり、multipart/form-data POST=リクエストで別のAPIに送信したい。
ただし、リクエストオブジェクトに問題があります。ローカルサーバーのファイルシステムにアクセスしたり、一時ファイルを作成したりするのではなく、ストリームまたはバッファを送信したい。ストリームの概念はかなり新しいです。
API送信から正しい応答を取得しますimage_file: fs.createReadStream('image.png')
しかし、私がしようとすると:image_file: data // buffer
image_file
パラメーターが欠落しているというエラーがAPIから表示されます。
助けてください!
Docs 使用しているAPIの場合(Face ++)
私は request を使用して投稿リクエストを作成しています。
問題のコードは次のとおりです。
app.post('/', (req, res) => {
const url = 'https://api-us.faceplusplus.com/facepp/v3/detect';
let data = [];
req.on('data', (chunk) => {
data.Push(chunk)
})
req.on('end', (req, res) => {
data = Buffer.concat(data);
const formData = {
api_key: process.env.FACEPP_API_KEY,
api_secret: process.env.FACEPP_API_SECRET,
// image_file: fs.createReadStream('image.png') // works
image_file: data // doesnt work
}
const options = {
uri: url,
method: 'POST',
formData
}
request(options, (err, response, body) => {
if (err) console.log(err)
console.log(body)
})
})
})
少し遊んだ後、次のコードを入手しました。うまく機能しています。元のマルチパートアップロードには、Multerミドルウェア( https://github.com/expressjs/multer )を使用しました。興味深いことに、ファイル名オプションを指定しない限り、リクエストはファイルをアップロードするニースを再生しないようです。
const multer = require('multer');
const upload = multer();
app.post('/', upload.any(), (req, res) => {
const url = 'https://api-us.faceplusplus.com/facepp/v3/detect';
console.log('Image upload complete, creating request to: ' + url);
var formData = {
api_key: process.env.FACEPP_API_KEY,
api_secret: process.env.FACEPP_API_SECRET,
image_file: {
value: req.files[0].buffer, // Upload the first file in the multi-part post
options: {
filename: 'image_file'
}
}
};
const options = {
uri: url,
formData: formData,
method: 'POST'
}
request(options, (err, response, body) => {
console.log('Request complete');
if (err) console.log('Request err: ', err);
console.log(body)
})
})
私は次のような応答を受け取っています:
{
"image_id": "GuF0MUPoaTcL/rbbcg+2kA==",
"request_id": "1520789753,d913cce4-118e-4893-a1ee-d1ace2b6a65b",
"time_used": 142,
"faces": [{
"face_rectangle": {
"width": 183,
"top": 125,
"left": 220,
"height": 183
},
"face_token": "8b8e327edfc10730f344b1465934a478"
}]
}
次のようなcurlを使用して、ローカルサーバーへの画像のアップロードをテストしました。
curl -v -i -F "data=@smiling_woman.jpg" -H "Content-Type: multipart/form-data" -X POST http://localhost:3000/