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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

863閲覧

画像ファイルのアップロード時、スマホの画像の向きを補正したい

chapp

総合スコア233

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/12/03 17:25

編集2018/12/04 02:12

お世話なります。dropzone.jsでファイルアップロードしたとき、スマホの画像の向きを補正したいと考えています。

テストとして単体のファイルを用意し実行すると、補正されるまで確認出来ているのですが、dropzone.jsで画像を渡すと、スクリプトが途中で止まっているような現象となっています。

※画像を渡している先は、upload.phpである。
※画像はアップされるが、upload.phpが途中で止まっているのか、エラーが起きているかで全ての処理が実行されない。

お恥ずかしいと思いながらも、以下が実際のファイル(upload.php)です。
コメントで補正部分のスクリプトを示しました。

ここ数日、試行錯誤を繰返していますが、補正スクリプトを加えるとファイル(upload.php)が適正に実行されないという状況が続いています。

お忙しい中恐縮ですが、アドバイスのほどお願い出来れば幸いです。
よろしくお願いいたします。

<?php session_start(); include($_SERVER['DOCUMENT_ROOT'] . '/define/BasicData.php'); $member_no = $_SESSION["member_no"]; $member_id = $_SESSION["member_id"]; require_once("../../../../security/bonpli/config.php"); $ds = DIRECTORY_SEPARATOR; $storeFolder = "./main_img/"; if(!empty($_FILES)){ $tempFile = $_FILES["file"]["tmp_name"]; $targetPath = dirname( __FILE__ ).$ds.$storeFolder.$ds; $filename = $_FILES["file"]["name"]; $file = explode('.', $filename); $kakuchousi = array_pop($file); $times=microtime(); $machining_time=explode(" ",$times); $format_time=$machining_time[1]+$machining_time[0]; $time = $format_time * 10000; $time = substr($time, -6); $img_filename = $member_no."-".$time.".".$kakuchousi; if(isset($_SESSION["img_filename"]) OR $_SESSION["img_filename"] != ""){ $_SESSION["img_filename"] .= ",".$img_filename; } else{ $_SESSION["img_filename"] .= $img_filename; } $targetFile = $targetPath.$img_filename; $filename = $_FILES["file"]["name"]; $file = explode(".", $filename); $file_name = $file[0]; move_uploaded_file($tempFile,$targetFile); $upfile = $storeFolder.$img_filename; //*** ↓↓ 補正スクリプト ↓↓ *** $image = orientationFixedImage($upfile, $upfile); // 画像の方向を正す function orientationFixedImage($output,$input){ $image = ImageCreateFromJPEG($input); $exif_datas = @exif_read_data($input); if(isset($exif_datas['Orientation'])){ $orientation = $exif_datas['Orientation']; if($image) { // 未定義 if($orientation == 0) { // 通常 }else if($orientation == 1) { // 左右反転 }else if($orientation == 2) { $image = image_flop($image); // 180°回転 }else if($orientation == 3) { $image = image_rotate($image, 180, 0); // 上下反転 }else if($orientation == 4) { $image = image_flip($image); // 反時計回りに90°回転 上下反転 }else if($orientation == 5) { $image = image_rotate($image, 90, 0); $image = image_flip($image); // 反時計回りに270°回転 }else if($orientation == 6) { $image = image_rotate($image, 270, 0); // 反時計回りに270°回転 上下反転 }else if($orientation == 7) { $image = image_rotate($image, 270, 0); $image = image_flip($image); // 反時計回りに90°回転 }else if($orientation == 8) { $image = image_rotate($image, 90, 0); } } } // 画像の書き出し ImageJPEG($image ,$output); return $image; } // 画像の左右反転 function image_flop($image){ // 画像の幅を取得 $w = imagesx($image); // 画像の高さを取得 $h = imagesy($image); // 変換後の画像の生成(元の画像と同じサイズ) $destImage = @imagecreatetruecolor($w,$h); // 逆側から色を取得 for($i=($w-1);$i>=0;$i--){ for($j=0;$j<$h;$j++){ $color_index = imagecolorat($image,$i,$j); $colors = imagecolorsforindex($image,$color_index); imagesetpixel($destImage,abs($i-$w+1),$j,imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"])); } } return $destImage; } // 上下反転 function image_flip($image){ // 画像の幅を取得 $w = imagesx($image); // 画像の高さを取得 $h = imagesy($image); // 変換後の画像の生成(元の画像と同じサイズ) $destImage = @imagecreatetruecolor($w,$h); // 逆側から色を取得 for($i=0;$i<$w;$i++){ for($j=($h-1);$j>=0;$j--){ $color_index = imagecolorat($image,$i,$j); $colors = imagecolorsforindex($image,$color_index); imagesetpixel($destImage,$i,abs($j-$h+1),imagecolorallocate($destImage,$colors["red"],$colors["green"],$colors["blue"])); } } return $destImage; } // 画像を回転 function image_rotate($image, $angle, $bgd_color){ return imagerotate($image, $angle, $bgd_color, 0); } //*** ↑↑ 補正スクリプト ↑↑ *** list($width,$height) = getimagesize($upfile); //幅を825pxに縮小 if($width > 825){ $hiritsu = 825 / $width; $width_edit = floor($width * $hiritsu); $height_edit = floor($height * $hiritsu); if($kakuchousi == "jpeg" OR $kakuchousi == "jpg" OR $kakuchousi == "JPEG" OR $kakuchousi == "JPG"){ $src = imagecreatefromjpeg($upfile); } if($kakuchousi == "png" OR $kakuchousi == "PNG"){ $src = imagecreatefrompng($upfile); } if($kakuchousi == "gif" OR $kakuchousi == "GIF"){ $src = imagecreatefromgif($upfile); } $dst = imagecreatetruecolor($width_edit, $height_edit); imagecopyresampled($dst, $src, 0, 0, 0, 0, $width_edit, $height_edit, $width, $height); imagejpeg($dst, $upfile); } $timestamp = time(); $query = "INSERT INTO b2b_img_upload_temp (temp_no, temp_member_no, temp_img, temp_time) VALUES (0, '$member_no', '$img_filename', '$timestamp')"; mysqli_query($mysqli, $query); } ?>

■追記

適正に実行されない・・・説明が不十分でした。
やりたいことは、

「画像をアップ → 適正な向きに補正 → サイズの変更 → DBにインサート」

なのですが、ご提示したスクリプトを実行すると、「サイズの変更」以降が実行されない状況です。向きの補正をする部分をコメントで示していますが、この部分、単体では問題ないものの、上記のように組み立てるとそこで止まっているような状況です。

アドバイスのほど頂戴出来れば幸いです。
よろしくお願いいたします。

■追記➁

色々と追加修正のご依頼ありがとうございます。
dropzone.jsにてupload.php(上記スクリプト)に渡しているので(直接アクセスしていない)Timeoutしている感はないのですが、状況をご説明すると、「正常に返答はあるが、サイズ変更、そしてテーブルへのインサートが実行されていない」という感じです。

補正スクリプト部だけの単体のファイルで実行すると(アップされている画像は)補正されます。

またupload.php も補正スクリプト部を外すと(補正はされないが)正常にサイズ変更、テーブルへのインサートは実行されます。

現状、上記2つを組み合わせるべく試行錯誤を繰返しているのですが、いずれも上手く行かない状況です。

引き続き、アドバイスのほど頂戴出来れば幸いです。
よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/12/04 00:15

「適正に実行されない」とは何が起きているのでしょうか
kunai

2018/12/04 01:46

「そこで止まる」と言うのは、PHPが実行中のままTimeoutするということでしょうか。正常に返答はあるが、サイズ変更が実行されていないと言う状態でしょうか。状態をそのまま教えてください。
guest

回答1

0

ベストアンサー

PHP

1$image = orientationFixedImage($upfile, $upfile);

で、画像書き出したあとで

PHP

1$src = imagecreatefromjpeg($upfile);

とか、$upfileをいじくり回したところで、書き出した後のファイルに影響が出ない(処理されていない)のは当然なのでは。

サイズ変更を行う箇所もfunction化して一括で処理させるか、サイズ変更を行う対象を$upfileではなく$outputにするかしないと。

投稿2018/12/04 01:54

kunai

総合スコア5405

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

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

chapp

2018/12/04 02:18

kunaiさん アドバイスありがとうございます。 >サイズ変更を行う対象を$upfileではなく$outputにするかしないと。 この部分ですが、少し具体的な形を教えて頂けますか? テーブルへのインサートが出来ないのも、この処理の影響なのか詰めていきたいと思いますが、上記箇所、具体的に教えて頂けるとありがたいです。 よろしくお願いいたします。
kunai

2018/12/04 02:22

まず、functionを一番下(上でもいい)にまとめて置くようにしてください。 今のままだと、if(!empty($_FILES)){の条件下でfunction定義されていたりしてとても気持ちが悪いです。 メインの処理部分と関数定義部分を明確に分けて、どこがどう処理されるか整理出来るようにしてください。 今の処理だと、orientationFixedImage()が呼ばれた時点で、そのfunctionの最後で行われているImageJPEG($image ,$output);が走り、その時点までの画像ファイルが書き出されてしまっています。 なので、その後で画像のサイズ変更を行うのであればこの「書き出した後の」ファイルであるべきですよね。 $upfileはアップロードされた素の画像、$outputは書き出された先のファイルですよね。
chapp

2018/12/04 02:52

kunaiさん 早々のお返事ありがとうございます。これから席を外す必要があるため、後ほど改めて確認いたします。 取り急ぎ、御礼まで。 引き続き、よろしくお願いいたします。
chapp

2018/12/04 08:15

kunaiさん お世話になっております。先ほどから色々と試していますが、そもそも画像の向きが補正出来ていませんでした。要はアップロードしただけの状態。 質問時に提示したupload.php内にある「向きの補正」ですが、単体では補正されること確認しているのですが、どこがおかしいのでしょうか・・・
chapp

2018/12/04 16:46

kunaiさん お世話になっております。この度は色々とお世話になりました。 どうしても質問時にご提示したスクリプトでは上手く行かなったため、別のスクリプトにて対処いたしました。 kunaiさんのご指摘は、考えるきっかけとなりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問