質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1374閲覧

Ruby on Railsでzipファイル取り込み → 解凍 → 画像の結合(つなぎ合わせる)処理を行いたい

THitokuse

総合スコア49

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

2クリップ

投稿2019/03/13 10:39

編集2019/03/13 16:55

概要

Ruby on Rails で

  1. フォームで送られてきたzipファイル(画像4枚から36枚が入っている)を解凍
  2. 画像を並び替え(画像の名前は xxxx_1.png から連番になっている)
  3. 画像を横4枚、縦9枚(最大)に結合(↓こんな感じです。)

イメージ説明
4. S3に保存
を行いたい。

問題

現状、1は require 'zip'を使用して、下記コードを生成して解凍しているのですが、
全画像ファイルを取得(解凍した画像のデータ全てを配列化)して、画像を並べて結合することができません。
なにかアドバイスがあればお願いします。。

Ruby

1 Zip::InputStream.open(@zip_file.path) do |input| 2 # 次に取得できるzip内のファイル情報を取得 3 entry = input.get_next_entry 4 file_name = entry.name 5 end

方法

方法としては、 require 'rmagick' を使用して画像を結合処理すると思うのですが、
そもそも解凍したファイルを配列化にして格納することができていない
ため、先に進めていない状況です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

RubyでZipを使ってやる!サンプル集を参考にやってみました。こんな感じでしょうか。

ruby

1require 'zip' 2 3array = [] 4Zip::InputStream.open(path_to_zip) do |input| 5 while entry = input.get_next_entry 6 array << {file_name: entry.name,data: input.read} 7 end 8end 9 10p array

要点としては

  • entryをwhileで取り入れる。eachのようには機能してくれない。
  • get_next_entryをしたらinputのポインタが変わる。データはinputからreadする。
  • 後々ファイル名とデータのマッピングが必要と思うので、連想配列にいれる。

といったところかと思います。
環境に合わせて変更するならinput.readで入ってくるところをrmagickでオブジェクトを作ってあげると非常に扱いやすくなるのではないでしょうか。

投稿2019/03/14 00:21

toushimi

総合スコア117

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

THitokuse

2019/03/14 09:39

回答ありがとうございます。 僕の共有不足だったのですが、rubyzipのバージョンが 1.2.1に上がっており、 4行目 InputStream → File に変更して使用いたしました。 ただ、他の部分は参考にさせていただきました。ありがとうございました。
toushimi

2019/03/14 12:03

よかったです!
guest

0

自己解決

上記解決しました。

Ruby

1require 'zip' 2 unzip_images = [] 3 Zip::File.open(@turn_table_zip_file.path) do |input| 4 input.each do |entry| 5   content = input.get_input_stream 6 # zipファイル解凍時、ディレクトリなどの不要なファイルが存在するため、FileTypeをfileに固定 7 unzip_images << {file_name: entry.name, data: content.read} if entry.ftype == :file 8 end 9 end

ポイント

・Zipファイルを展開するブロックの外側に空の配列 unzip_images = [] を生成
→ ブロック外で展開したデータを使用したいため。
https://qiita.com/fyhcu/items/5c9dfaed6346b33727f5

・ Rubyzipのメソッドを使用してファイルを展開
・Zipファイルの性質上、Zip内にファイル以外のデータも混ざっている。(directory)
→ これが厄介だった!!

if entry.ftype == :file

でファイル画像のみ取り出す(これをしないとディレクトリではバイナリーデータが存在しないため、dataの所でエラーが出る。)
→ これもなかなか詰まってしまった。。

Ruby zipのバージョンアップに伴う変更点

今回1.1系と1.2系で違う所が2点あったので共有します。

Zip::InputStream.open(path_to_zip) do |input| ↓ Zip::File.open(path_to_zip) do |input|
input.get_next_entry ↓ input.get_input_stream

時間があるときにもう少し詳しく書きます。

投稿2019/03/14 09:55

THitokuse

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問