つきのさんアソビバ。

IT的なことからアケゲー、オンゲなど趣味もつらつら

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. 分析結果を画面に表示する」まで一気にやってしまいました…。
次は分析結果を加工してデータベースに登録していこうかと。