perlで写真をアップロードするフォームがあります。
写真をフォームからアップロードするとサーバーの写真用の保存フォルダに保存され、その写真をウェブ上で見れるようにしています。
今は写真をアップロードすると写真のexif情報もそのまま保存されます。
これをアップロードする時に写真からexif情報を削除してアップロードしたいと考えています。
調べてみるとImage::Magickのstripオプョンを使うことでexif情報が削除できるとのことで、
アップロードする写真の保存処理の部分にImage::Magickのstripオプョンを組み込むのではないかと思うのですが、
どのようにすればよいのかわかりません。
以下は、HTML上のアップロードするフォームとperlの写真の保存処理のコードです。
利用しているサーバー(ロリポップ)ではImage::Magickは利用可(パスは /usr/bin/convert)となっています。
#HTML <input type="file" name="●●●" />
#PERL sub UpFile { $macbin=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$2; } if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; } if ($_ =~ /application/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $fname =~ tr/\"\x0D\x0A//d; $flag=0; if ($tail =~ /image/gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /image/jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($tail =~ /image/x-png/i && $png) { $tail=".png"; $flag=1; } if (!$flag) { if ($fname =~ /.gif$/i && $gif) { $tail=".gif"; $flag=1; } if (($fname =~ /.jpe?g$/i && $jpeg)) { $tail=".jpg"; $flag=1; } if ($fname =~ /.png$/i && $png) { $tail=".png"; $flag=1; } } foreach $confirm_type (@confirm_type) { if ( $fname =~ /.$confirm_type$/i ) { $tail=".$confirm_type"; $flag=2; $org_width="file"; last; } } if (!$flag) { return; } elsif (!$flag) { &error("アップロードできないファイル形式です","lock"); } $upfile = $in{'upfile'}; if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } $ImgFile = "$ImgUrl$no$tail"; open(OUT,"> $ImgFile") || &error("画像のアップロードに失敗しました","lock"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666,$ImgFile); if ($tail eq ".jpg") { ($W, $H) = &JpegSize($ImgFile); } elsif ($tail eq ".gif") { ($W, $H) = &GifSize($ImgFile); } elsif ($tail eq ".png") { ($W, $H) = &PngSize($ImgFile); } elsif ( $flag eq "2" ) { $W = $down_ix; $H = $down_iy; } if ($W > $MaxW || $H > $MaxH) { $orw = $W; $orh = $H; $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } } sub JpegSize { local($jpeg) = @_; local($t, $m, $c, $l, $W, $H); open(JPEG, "$jpeg") || return (0,0); binmode JPEG; read(JPEG, $t, 2); while (1) { read(JPEG, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $t, 5); ($H, $W) = unpack("xnn", $t); last; } else { read(JPEG, $t, ($l - 2)); } } close(JPEG); return ($W, $H); }
以下は参考サイトなどを見ながら自分でやってみたものですが、アップされた写真のexif情報は削除されませんでした。
sub UpFile { $macbin=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)/i) { $tail=$2; } if ($_ =~ /(.*)filename=(.*)/i) { $fname=$2; } if ($_ =~ /application/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $fname =~ tr/\"\x0D\x0A//d; $flag=0; if ($tail =~ /image/gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /image/jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if ($tail =~ /image/x-png/i && $png) { $tail=".png"; $flag=1; } if (!$flag) { if ($fname =~ /.gif$/i && $gif) { $tail=".gif"; $flag=1; } if (($fname =~ /.jpe?g$/i && $jpeg)) { $tail=".jpg"; $flag=1; } if ($fname =~ /.png$/i && $png) { $tail=".png"; $flag=1; } } foreach $confirm_type (@confirm_type) { if ( $fname =~ /.$confirm_type$/i ) { $tail=".$confirm_type"; $flag=2; $org_width="file"; last; } } if (!$flag) { return; } elsif (!$flag) { &error("アップロードできないファイル形式です","lock"); } $upfile = $in{'upfile'}; if ($macbin) { $length = substr($upfile,83,4); $length = unpack("%N",$length); $upfile = substr($upfile,128,$length); } $ImgFile = "$ImgUrl$no$tail"; ####以下を追記してみましたがアップされた写真のexif情報は削除されませんでした#### my $im = new Image::Magick; $im -> Read( $ImgFile ); $im -> Strip; $im -> Write( $ImgFile ); ####//追記#### open(OUT,"> $ImgFile") || &error("画像のアップロードに失敗しました","lock"); binmode(OUT); binmode(STDOUT); print OUT $upfile; close(OUT); chmod (0666,$ImgFile); if ($tail eq ".jpg") { ($W, $H) = &JpegSize($ImgFile); } elsif ($tail eq ".gif") { ($W, $H) = &GifSize($ImgFile); } elsif ($tail eq ".png") { ($W, $H) = &PngSize($ImgFile); } elsif ( $flag eq "2" ) { $W = $down_ix; $H = $down_iy; } if ($W > $MaxW || $H > $MaxH) { $orw = $W; $orh = $H; $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; } }
Image::Magick以外の方法でも構いませんので、アップロードする画像のexif情報を削除する方法がありましたらばアドバイスお願いいたします。

回答1件
あなたの回答
tips
プレビュー