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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

3843閲覧

jQuery+PHPで複数画像ファイルをリサイズしアップロードする方法を知りたい

shot2020

総合スコア1

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/11/09 07:31

jQueryで、複数(三つ)の画像ファイルを選択しリサイズした後、PHPでサーバーにアップロード(指定のディレクトリー"./images/"に保存)したいのですが、
後述のスクリプトでは、最後に選択したファイルだけしか、リサイズ・保存されません。
クロームのデベロッパーツールで確認するとBlobは、複数確認できているので、
アップロード開始ボタン(投稿)をクリックした後の jQuery('#upload').click(function()内で、
ループ配列化して、phpに送ればよいのでは、色々と試してみたのですが、jQuery javascript php等々、プログラム全般について初心者のため、
うまく配列化できません。
配列での送受信あるいは、別の方法での複数画像ファイルのリサイズアップロードのやり方について、ご教授頂けないでしょうか。

なお、複数ファイル選択で、下のように
<input type="file" name="file1" id="idtmp1" accept="image/*">
「multiple」を使っていないのは、サーバー側で値を出力する際、順位を特定したいからです。

よろしくお願いいたします。

HTML+ javascript部分
[index.html]

<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <meta http-equiv="content-script-type" content="text/javascript" /> <meta http-equiv="content-style-type" content="text/css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> </head> <body> <div> <form enctype="multipart/form-data" method="post"> <table align="center"> <tr> <td align="center"> <input type="file" name="upfile[]" id="idtmp1" accept="image/*"><br><canvas id="canvas1" width="0" height="0"></canvas><br> <input type="file" name="upfile[]" id="idtmp2" accept="image/*"><br><canvas id="canvas2" width="0" height="0"></canvas><br> <input type="file" name="upfile[]" id="idtmp3" accept="image/*"><br><canvas id="canvas3" width="0" height="0"></canvas><br> </td> </tr> </table> <table align="center"> <tr> <td align="center"> <!-- アップロード開始ボタン --> <button class="btn btn-primary" id="upload">投稿</button> <button type=reset class="gryBtn100">Reset</button> </td> </tr> </table> </form> </div> <script type="text/javascript"> // 縮小後 アップロード jQuery(function() { var file = null; // 選択されるファイル var blob = null; // 画像(BLOBデータ) const THUMBNAIL_WIDTH = 500; // 画像リサイズ後の横の長さの最大値 const THUMBNAIL_HEIGHT = 500; // 画像リサイズ後の縦の長さの最大値 // ファイルが選択されたら jQuery('input[type=file]').change(function() { // サムネ描画位置指定のためid名から番号取得 var idName = jQuery(this).attr("id"); var n = idName.slice( -1 ) ; // ファイルを取得 file = jQuery(this).prop('files')[0]; // 選択されたファイルが画像かどうか判定 if (file.type != 'image/jpeg' && file.type != 'image/jpg' && file.type != 'image/gif' && file.type != 'image/png') { alert("Only the following file types can be uploaded:JPG, JPEG, PNG, GIF"); file = null; blob = null; // 選択されたファイルをクリア jQuery('input[type=file]').val(''); return; } // 選択されたファイルが制限サイズ内かどうか判定 if((1200 * 1024)< file.size){ alert("ファイル容量を超えています"); file = null; blob = null; // 選択されたファイルをクリア jQuery('input[type=file]').val(''); return; } // 画像をリサイズする var image = new Image(); var reader = new FileReader(); reader.onload = function(e) { image.onload = function() { var width, height; if(image.width > image.height){ // 横長の画像は横のサイズを指定値にあわせる var ratio = image.height/image.width; width = THUMBNAIL_WIDTH; height = THUMBNAIL_WIDTH * ratio; } else { // 縦長の画像は縦のサイズを指定値にあわせる var ratio = image.width/image.height; width = THUMBNAIL_HEIGHT * ratio; height = THUMBNAIL_HEIGHT; } // サムネ描画位置取得 var canvas_n = '#canvas' + n; // サムネ描画用canvasのサイズを上で算出した値に変更 var canvas = jQuery(canvas_n) .attr('width', width) .attr('height', height); var ctx = canvas[0].getContext('2d'); // canvasに既に描画されている画像をクリア ctx.clearRect(0,0,width,height); // canvasにサムネイルを描画 ctx.drawImage(image,0,0,image.width,image.height,0,0,width,height); // canvasからbase64画像データを取得 var base64 = canvas.get(0).toDataURL('image/jpeg'); // base64からBlobデータを作成 var barr, bin, i, len; bin = atob(base64.split('base64,')[1]); len = bin.length; barr = new Uint8Array(len); i = 0; while (i < len) { barr[i] = bin.charCodeAt(i); i++; } blob = new Blob([barr], {type: 'image/jpeg'}); console.log(blob); } image.src = e.target.result; } reader.readAsDataURL(file); }); // アップロード開始ボタンがクリックされたら jQuery('#upload').click(function(){ // ファイルが指定されていなければ何も起こらない if(!file || !blob) { return; } var name, fd = new FormData(); fd.append('file', blob); // ファイルを添付する jQuery.ajax({ url: 'upload.php', // 送信先 type: 'POST', dataType: 'html', data: fd, processData: false, contentType: false }) .done(function( data, textStatus, jqXHR ) { // 送信成功 alert(data); location.href = "./"; // ページリロード }) .fail(function( jqXHR, textStatus, errorThrown ) { // 送信失敗 alert('ERROR : ' + status + ' : ' + errorThrown); }); }); }); </script> </body> </html>

PHP部分
[upload.php]

<?php /* 拡張子情報の取得・セット */ $imginfo = getimagesize($_FILES['file']['tmp_name']); if($imginfo['mime'] == 'image/jpeg'){ $extension = ".jpg"; } if($imginfo['mime'] == 'image/png'){ $extension = ".png"; } if($imginfo['mime'] == 'image/gif'){ $extension = ".gif"; } /* 拡張子存在チェック */ if(!empty($extension)){ /* 画像登録処理 */ $file_tmp = $_FILES['file']['tmp_name']; $file_name = "sample" . $extension; // アップロード時のファイル名を設定 $file_save = "./images/" . $file_name; // アップロード対象のディレクトリを指定 move_uploaded_file($file_tmp, $file_save); // アップロード処理 echo "success"; // jquery側にレスポンス } else { echo "fail"; // jquery側にレスポンス } ?>

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

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

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

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

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

guest

回答1

0

ベストアンサー

原則画像のリサイズはサーバー側にやらせた方がいいでしょう
(canvasでクオリティが満足ならそれもあるかもしれませんが)

投稿2020/11/09 07:47

編集2020/11/09 07:53
yambejp

総合スコア114775

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

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

yambejp

2020/11/09 07:48

最後のデータだけなのは fd = new FormData(); で初期化しているからでは? 予めfdをつくっておいて、各file毎にappendしてあげてください
yambejp

2020/11/09 13:46

せっかくなのでざっくり作ってみました。 <form> <input type="file" name="upfile[]" id="idtmp1" accept="image/*"><br> <input type="file" name="upfile[]" id="idtmp2" accept="image/*"><br> <input type="file" name="upfile[]" id="idtmp3" accept="image/*"><br> <button type="submit" class="btn btn-primary" id="upload">投稿</button> </form>
yambejp

2020/11/09 13:46

window.addEventListener('DOMContentLoaded', ()=>{ document.querySelector('#upload').addEventListener('click',async e=>{ e.preventDefault(); const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const files=[...document.querySelectorAll('[type=file]')].filter(x=>x.value).map(x=>({name:x.name,file:x.files[0]})); const method="post"; const body = new FormData(); for(var x of files){ const file=x.file; const name=x.name; var scale=0.2; const type=file.type; const blob=new Blob([file],{type:type}); const url = URL.createObjectURL(blob); await new Promise(resolve=>{ const image = new Image(); image.addEventListener('load',()=>{ const dstWidth = image.width * scale; const dstHeight = image.height * scale; canvas.width = dstWidth; canvas.height = dstHeight; ctx.drawImage(image, 0, 0, image.width,image.height, 0, 0, dstWidth, dstHeight); const base64 = canvas.toDataURL(type); const bin = atob(base64.replace(/^.*,/, '')); const buffer = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) { buffer[i] = bin.charCodeAt(i); } const blob = new Blob([buffer.buffer], {type}); resolve([name,blob,file.name]); }); image.src=url; }).then(res=>{ body.append(res[0],res[1],res[2]); }); } fetch("send.php",{method,body}).then(res=>res.text()).then(console.log); }); });
shot2020

2020/11/09 21:04

yambejp様、 このたびは、ご親切にコードを書いていただきありがとうございました。 実は、最初に頂いたアドバイスを参考に、あれこれ、何度となく試してもvar_dump($_FILES) を確認すると全く、配列化できませんでした。 今朝、早朝に、テラテイルからのメールを見たら、新たにyambejp様からご助言を頂いており、なんと コードが書かれていました。 さっそく、下のphpで確認したところ、期待通りに、リサイズされた画像ファイルをサーバーに 保存することができました。 3日あまり、これに悩んでいたのが解決でき、大変うれしい限りです。 本当にありがとうございました。 <?php // ファイルがあれば処理実行 if(isset($_FILES["upfile"])){ // アップロードされたファイル件を処理 for($i = 0; $i < count($_FILES["upfile"]["name"]); $i++ ){ // アップロードされたファイルか検査 if(is_uploaded_file($_FILES["upfile"]["tmp_name"][$i])){ // ファイルをお好みの場所に移動 move_uploaded_file($_FILES["upfile"]["tmp_name"][$i], "./images/" . $_FILES["upfile"]["name"][$i]); } } } ?>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問