Symfoware

Symfowareについての考察blog

RabbitMQ MsgPackを使用して、画像のタイトルと実データをキューに登録する

RabbitMQ、キューに画像データを登録できることがわかりました。
RabbitMQに画像データをキューとして登録する

これ、1つ問題があってアップロードされた時のタイトルが失われてしまいます。
何かいい方法がないかと考えてみた結果、
MessagePackでタイトルと画像データをパックして登録すれば良いのでは?
RabbitMQにMessagePackのデータをキューとして登録する


早速試してみます。


登録用のプログラム



登録用のプログラムはこのようになりました。

ファイル選択用のhtml

・pic.html


  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>画像のアップロード</title>
  6. </head>
  7. <body>
  8. <form action="send.php" method="post" enctype="multipart/form-data">
  9. ファイル:<br />
  10. <input type="file" name="upfile" size="30" /><br />
  11. <br />
  12. <input type="submit" value="アップロード" />
  13. </form>
  14. </body>
  15. </html>





処理部分のphp

・send.php


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. if (!is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
  6.     echo "ファイルが選択されていません。";
  7.     return;
  8. }
  9. # ファイルの付帯情報取得
  10. $name = $_FILES['upfile']['name']; #ファイル名
  11. $mime_type = $_FILES['upfile']['type']; # mime
  12. $size = $_FILES['upfile']['size']; # ファイルサイズ
  13. # アップロードされた画像データをメモリにロード
  14. $image = file_get_contents($_FILES["upfile"]["tmp_name"]);
  15. # データの準備
  16. $data = array(
  17.             'name' => $name,
  18.             'mime_type' => $mime_type,
  19.             'size' => $size,
  20.             'image' => $image
  21.             );
  22. # シリアライズ実行
  23. $binary = msgpack_serialize($data);
  24. # RabbitMQに接続
  25. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  26. $channel = $connection->channel();
  27. # キューに永続化モードで接続
  28. $channel->queue_declare('image', false, true, false, false);
  29. $properties = array('content_type' => 'text/plain', 'delivery_mode' => 2);
  30. # データ登録実行
  31. $msg = new AMQPMessage($binary, $properties);
  32. $channel->basic_publish($msg, '', 'image');
  33. echo " [x] Sent image data<br>";
  34. $channel->close();
  35. $connection->close();







受信用のプログラム



受信して画像データを復元するプログラムはこうなります。

・recv.py


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. import msgpack
  4. # ユーザー名とパスワード
  5. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  6. # 接続パラメーター作成
  7. connect_param = pika.ConnectionParameters(
  8.                     host='192.168.1.12',
  9.                     credentials=credentials)
  10. # コネクション作成
  11. connection = pika.BlockingConnection(connect_param)
  12. channel = connection.channel()
  13. # imageキューに接続
  14. channel.queue_declare(queue='image',durable=True)
  15. print ' [*] Waiting for messages. To exit press CTRL+C'
  16. # コールバックメソッドを指定
  17. def callback(ch, method, properties, body):
  18.     
  19.     # データを復元
  20.     ret = msgpack.unpackb(body)
  21.     
  22.     print ret['name']
  23.     print ret['mime_type']
  24.     print ret['size']
  25.     
  26.     # 画像データ復元
  27.     f = open(ret['name'], 'wb')
  28.     f.write(ret['image'])
  29.     f.close()
  30.     
  31. # コールバックを登録して待ち受け
  32. channel.basic_consume(callback,
  33.                      queue='image',
  34.                      no_ack=True)
  35. channel.start_consuming()






実行してみると、ちゃんと登録した時のファイル名や、実際の画像の復元が行えました。


$ python recv.py
[*] Waiting for messages. To exit press CTRL+C
testpic.jpg
image/jpeg
425816

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/07(日) 19:24:39|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<beanstalkd jobサイズの変更方法(JOB_TOO_BIGエラー対策) | ホーム | RabbitMQに画像データをキューとして登録する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1493-542b78d5
この記事にトラックバックする(FC2ブログユーザー)