Amon2(Plack)で複数の画像を同時に受け取る

html5で複数ファイルを選択(input type=”file”で複数ファイル選択と形式を指定(html5))して、サーバーに送信されたファイルをサーバー側で受け取ってみます。
サーバーサイドはPerl(Amon2+Plack)です。

Plack::Request::Upload

普通にファイルをひとつだけ選択して送信した場合であれば、

$c->req->uploads;

で、受け取れるんですけど、複数ファイルには対応してないんかな?

$c->req->env->{‘plack.request.http.body’}

とりあえず$c->req->envをdumpしてみたら、envに入ってるのは確認できたので、envから直接受け取る事にします。

$c->req->env->{'plack.request.http.body'}->upload;

envの中身(素の状態)では、
1つだけ選択した場合は、hashrefが、
複数選択した場合は、中にarrayrefが入っているようです。

my $files = $c->req->env->{'plack.request.http.body'}->upload->{'icon'};
# 最後のiconは、inputのnameです。 ex) <input type="file" name="icon">

if ( ref $files eq 'ARRAY' ) {
  # 複数用の処理
}
else {
  # 単一用の処理
}

単一だった場合は、下記みたいな感じで配列にしちゃってあとは処理を同じにしてしまうのが良さそうですね。

$files = [ $files ];