Amazon Rekognitionを検証する名目による御遊び その2
tukino-salve.hatenablog.com
Expressのディレクトリ構造は大体分かったんで、本題に戻ります。
今回は
1. ファイルをアップロードする
2. アップロードしたファイルを分析する
3. 分析結果を画面に表示する
と言う流れができればいいかな、という目標でやります。
まずは「1. ファイルをアップロードする」。
これはmulterを使ったらすぐだったので、まぁそんな感じです。
一旦はtmpに保持し、何かしら処理をしてtmpから削除することを想定しています。
views/imgupld.ejs
<!DOCTYPE html> <html> ・・・ <body> <div id='mes'><%= mes %></div> <form method='post' enctype='multipart/form-data' action='imgupld/upload'> <input type='file' name='uploadedfile'> <input type='submit'> </form> </body> </html>
routes/imgupld.js
var express = require('express'); var router = express.Router(); var aws = require('aws-sdk'); ・・・ // multerとfsをrequire var multer = require("multer"); var storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null, './tmp') }, filename: function(req, file, cb) { cb(null, '[' + Date.now() + ']' + file.originalname) } }); var upload = multer({storage: storage}); var fs = require('fs'); // upload時の振る舞いを追加 router.post("/upload", upload.single("uploadedfile"), function(req, res, next) { console.log(req.file); // uploadされたファイルを削除 fs.unlink(req.file.path, function(err) { }); res.redirect(301, '/imgupld'); }) module.exports = router;
続いて「2. アップロードしたファイルを分析する」のためにまずはEC2⇒S3にファイルを転送、と思っていたのですが、EC2にS3がマウントできるらしい・・・。
・・・マァソラデキルワナ。
早速以下のサイト様を参考にマウントをやってみました。
qiita.com
[root@ip-10-1-0-54 ~]# sudo /usr/bin/s3fs image-categorize /mnt/s3_image-categorize -o rw,allow_other,uid=500,gid=500,default_acl=public-read,iam_role=ec2_mnt_s3 [root@ip-10-1-0-54 ~]# less /var/log/messages [root@ip-10-1-0-54 ~]# df -kh Filesystem Size Used Avail Use% Mounted on devtmpfs 487M 56K 487M 1% /dev tmpfs 498M 0 498M 0% /dev/shm /dev/xvda1 7.8G 1.4G 6.3G 18% / s3fs 256T 0 256T 0% /mnt/s3_image-categorize [root@ip-10-1-0-54 ~]# ls -l /mnt/s3_image-categorize total 74 ---------- 1 ec2-user ec2-user 75355 Mar 16 06:45 cat.jpg
うん、ここも大きなトラブルなく完了。
早速tmpをこちらに置き換えてみます。※マウントにした都合上、ファイル削除は要らなくなったのでその辺はコメントアウト
routes/imgupld.js
var express = require('express'); var router = express.Router(); var aws = require('aws-sdk'); ・・・ // multerとfsをrequire var multer = require("multer"); var storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null, '/mnt/s3_image-categorize') }, filename: function(req, file, cb) { cb(null, '[' + Date.now() + ']' + file.originalname) } }); var upload = multer({storage: storage}); //var fs = require('fs'); // upload時の振る舞いを追加 router.post("/upload", upload.single("uploadedfile"), function(req, res, next) { console.log(req.file); // uploadされたファイルを削除 //fs.unlink(req.file.path, function(err) { //}); res.redirect(301, '/imgupld'); }) module.exports = router;
これも問題なく動く。
うーん。思ったより順調であんまり書く事もありません。
しかしまぁこのまま進めます。
続けてアップロードしたファイルを分析して画面に返してやります。
var express = require('express'); var router = express.Router(); var aws = require('aws-sdk'); aws.config.update({ accessKeyId: 'xxxx', secretAccessKey: 'xxxx', region: 'us-east-1', }); aws.config.apiVersion = { rekognition: '2016-06-27', }; var multer = require("multer"); var storage = multer.diskStorage({ destination: function(req, file, cb) { cb(null, '/mnt/s3_image-categorize') }, filename: function(req, file, cb) { cb(null, '[' + Date.now() + ']' + file.originalname) } }); var upload = multer({storage: storage}); //var fs = require('fs'); router.get('/', function(req, res, next) { console.log('get start'); res.render('imgupld', {mes : ''}); console.log('get end'); }); router.post("/upload", upload.single("uploadedfile"), function(req, res, next) { console.log('imgupld upload start'); console.log(req.file); var rekognition = new aws.Rekognition(); console.log('req_file_name : ' + req.file.filename); // Rekognitionに渡すイメージを設定 var params = { Image: { S3Object: { Bucket: 'image-categorize', Name: req.file.filename } }, MaxLabels: 100, MinConfidence: 70 }; // Rekognitionからの戻り値で画面表示値を作成 var mes = ''; rekognition.detectLabels(params, function(err, data) { if(err) { console.log(err, err.stack); } else { data.Labels.forEach(function(label) { mes += label.Name + ': ' + Math.round(label.Confidence) + "\%\n"; }); } console.log("mes :" + mes); res.render('imgupld', {mes : mes}); }); console.log('imgupld upload end'); }) module.exports = router;
「3. 分析結果を画面に表示する」まで一気にやってしまいました…。
次は分析結果を加工してデータベースに登録していこうかと。