複数ファイルアップロードのバリデーション
複数ファイルアップロードのバリデーションを書いてみましょう。
HTML側
HTML側のファイルアップロードのフォームです。四つのファイルアプロードのフィールドがあります。エラー表示と削除に対応しているものです。
<form action=<%= url_for %> method="POST", enctype="multipart/form-data">
%= hidden_field op => 'update';
%= hidden_field id => $id;
<ul>
<li>
画像1. <%= file_field 'image1' %>
<div class="error"><%= $errors->{'image1'} ? $errors->{'image1'} : '' %></div>
削除 <%= check_box 'image1_delete' %>
</li>
<li>
画像2. <%= file_field 'image2' %>
<div class="error"><%= $errors->{'image2'} ? $errors->{'image2'} : '' %></div>
削除 <%= check_box 'image2_delete' %>
</li>
<li>
画像3. <%= file_field 'image3' %>
<div class="error"><%= $errors->{'image3'} ? $errors->{'image3'} : '' %></div>
削除 <%= check_box 'image3_delete' %>
</li>
<li>
画像4. <%= file_field 'image4' %>
<div class="error"><%= $errors->{'image4'} ? $errors->{'image4'} : '' %></div>
削除 <%= check_box 'image4_delete' %>
</li>
</ul>
</form>
プログラム側
プログラム側のサンプルコードです。パラメーターで取得したものは、Mojo::Uploadオブジェクトになります。複数のファイルフィールドの値をとって、画像情報を作成して、配列のリファレンスにしています。
ファイルのサイズがあった場合に、ファイルの種類を判定しています。
<%
my $op = param('op') // '';
my $id = param('id');
my $errors = {};
if ($self->req->method eq 'POST') {
if ($op eq 'update') {
# パラメーターの取得
my $images = [];
my $image_count = 4;
for (my $number = 1; $number <= $image_count; $number++) {
my $image_upload = param("image$number");
my $image = {
upload => $image_upload,
number => $number,
};
push @$images, $image;
}
# バリデーション
for my $image (@$images) {
my $image_upload = $image->{upload};
if ($image_upload->size > 0) {
# コンテントタイプ
my $image_content_type = $image_upload->headers->content_type;
# 拡張子
my $ext;
# PNG
if ($image_content_type =~ m|\bimage/png\b|) {
$ext = 'png';
}
# JPEG
elsif ($image_content_type =~ m|\bimage/jpeg\b|) {
$ext = 'jpg';
}
# GIF
elsif ($image_content_type =~ m|\bimage/gif\b|) {
$ext = 'gif';
}
# PDF
elsif ($image_content_type =~ m|\bapplication/pdf\b|) {
$ext = 'pdf';
}
unless (defined $ext) {
my $number = $image->{number};
$errors->{"image$number"} = "画像$image->{number}のファイルの種類が不正です。";
}
}
}
}
}
}
%>
Mojolicious入門