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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2432閲覧

フォームで取得した画像を縮小しajaxでアップロード

blacktm06

総合スコア6

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/03/05 02:45

前提・実現したいこと

<input type="file">で選択した画像をcanvasに縮小してプレビュー、それをjavascriptでblobデータで送信、phpでアップロードしたいです。

発生している問題・エラーメッセージ

ajaxにて縮小ファイル送信、受け取り側のphpでアップロードはできるのですが、元のinputで選択した縮小前の画像も一緒にアップロードされてしまいます。

該当のソースコード

HTML

1<!--new.php--> 2<form method="POST" enctype="multipart/form-data" action="done.php"> 3<input type="file" name="image" accept="image/*"> 4<input id="send" type="submit" value="登録"> 5</form>

javascript

1//new.php内に記述 2$('#send').click(function(){ 3if(!file || !blob) { //fileは選択されるファイル、blobは<canvas>に描画された縮小済みのblobデータ 4return; 5} 6 7var fd = new FormData(); 8fd.append("image", blob); 9for(item of fd) console.log(item); 10$.ajax({ 11url: 'done.php', 12type: 'POST', 13dataType: 'json', 14data: fd, 15processData: false, 16contentType: false 17}) 18 19.done(function( data, textStatus, jqXHR ) { 20 21}) 22.fail(function( jqXHR, textStatus, errorThrown ) { 23 24}); 25

php

1//done.php 2<?php 3header("Content-type: text/html; charset=utf-8"); 4$tmpName = $_FILES['image']['tmp_name']; 5$mime = $_FILES['image']['type']; 6 7if($mime == 'image/jpeg' || $mime == 'image/pjpeg'){ 8$ext = '.jpg'; 9$image1 = imagecreatefromjpeg($tmpName); 10} elseif($mime == 'image/png' || $mime == 'image/x-png'){ 11$ext = '.png'; 12$image1 = imagecreatefrompng($tmpName); 13} elseif($mime == 'image/gif'){ 14$ext = '.gif'; 15$image1 = imagecreatefromgif($tmpName); 16} else { 17return false; 18} 19$filename = sha1(microtime() . $_SERVER['REMOTE_ADDR'] . $tmpName) . $ext; 20$dir = 'image/'; 21$uploadfile = $dir . $filename; 22if ($_FILES['image']){ 23$uploadfile = $dir . $filename; 24move_uploaded_file($_FILES['image']['tmp_name'],$uploadfile); 25}

試したこと

Javascriptのfd.append("image", blob);のimageを別名に変えるとアップロードはできてましたがNotice: Undefined index: image in ~ とエラーがでました。

補足情報

for(item of fd) console.log(item);のchromeでのコンソール表示↓

(2) ["image", File]
0: "image"
1: File {name: "blob", lastModified: 1583374717041, lastModifiedDate: Thu Mar 05 2020 11:18:37 GMT+0900 (日本標準時), webkitRelativePath: "", size: 5591, …}
length: 2
proto: Array(0)

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

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

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

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

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

yambejp

2020/03/05 02:55

> <input type="file">で選択した画像をcanvasに縮小してプレビュー、それをjavascriptでblobデータで送信、phpでアップロードしたいです。 整理してください ・fileで選んだファイルをcanvasに流し込む? ・別にjpegやpngでプレビューすればいいのでは? ・blobデータで送信:ajaxないしfetchの処理? ・プレビューをなぜ送信するのでしょう?本データではまずい? ・blob送信はよいとして画像形式にコンバートしないとファイルにならないのでは? ・phpでアップロード:ちょっと表現が変。phpでうけて画像ファイルを保存するのですか?
blacktm06

2020/03/05 04:02

初心者なものでちょっと理解できてない部分があると思います。 ・fileで選んだファイルをcanvasに流し込む? ・別にjpegやpngでプレビューすればいいのでは? →プレビュー自体は構わないです。 ・blobデータで送信:ajaxないしfetchの処理? →ajaxだと思います。 ・プレビューをなぜ送信するのでしょう?本データではまずい? →容量が大きいので。リサイズして容量を減らしたデータを送りたいです。 ・blob送信はよいとして画像形式にコンバートしないとファイルにならないのでは? アップロード自体は縮小されたものでされてました。 ・phpでアップロード:ちょっと表現が変。phpでうけて画像ファイルを保存するのですか? →理解できていないこともあるので表現が間違っているかもしれません。。 javascriptでdone.phpへ送信してdone.php内の move_uploaded_file で $_FILES を名前変えてアップロードするという理解でした。 consolでみると元データと縮小データ2つ送られてるっぽいです。
guest

回答2

0

ベストアンサー

formのsubmit止めてないようなのでdone.phpへの送信が2度起きてませんか?

投稿2020/03/05 03:05

m.ts10806

総合スコア80875

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

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

blacktm06

2020/03/05 04:37 編集

onsubmit="location.href='done.php'; return false;"とかsubmitのonclickとかで送信を止めるのでしょうか。 やってみたら Notice: Undefined index: image in ~ のエラーがでます。。
m.ts10806

2020/03/05 05:23

そりゃlocationでは送信しませんからそうなりますよ。 急にonsubmitが出てきたのはよくわかりませんけど、今のボタンのtypeをsubmitからbuttonに変更すると早いです。formのaction属性は不要ですね。非同期で処理しますし。
blacktm06

2020/03/05 05:44

ファイル以外にもtype="text"やtype="radio"の値も送るとなると別の方法で送ることになりますか? done.phpが登録完了画面として送られたテキストを表示させるとすれば。 done.phpに画面遷移はさせたいです。。
m.ts10806

2020/03/05 06:01

シリアライズしてフォームデータ送ればどんな入力コントロールが幾つあっても関係ないですよ。 それに、done.phpとやらを非同期通信と画面表示両方に使ってはいけません。 どちらかのみにしてください。 非同期通信は画面表示や遷移を伴わないサーバーサイドプログラムの実行手法です。
blacktm06

2020/03/05 08:52

ajaxでデータを送る先をdone.php、表示用をresult.phpと分ければ大丈夫でしょうか? それとも非同期通信を使う際は画面遷移すること自体がいけない?? 非同期通信自体???な状態ではあり的外れなことかもしれませんがすみません。。 最終的にはフォームに入力したテキストや縮小した画像(アップロードしたパス)をデータベースに登録したいと思っています。 一度分けて試してみたのですが、done.phpの$uploadfileに格納されたパスを完了画面result.phpに渡す方法がわからなくて今に至ります。
m.ts10806

2020/03/05 10:01

登録した後どうしたいか次第です。 画面遷移したあとに何かDBやセッションなどPHP通さないと取れない情報が必要かとか。 それも要件次第です。「完了しました」だけならJavaScriptで出せますし。
blacktm06

2020/03/06 04:20

もともと考えていた内容としては、フォームにアイテム名などテキスト入力、画像を選択して登録ボタンを押すと完了画面(done.php)に遷移し$_POSTを受け取ってdone.php内のhtmlで登録内容の出力、画像はアップロード先のpathを返しimgタグで表示、DB登録といった内容にしたかったのです。画像がなかったらうまくいったのですが。。
blacktm06

2020/03/09 02:01

シリアライズしてupload.phpに送信してmove_uploaded_fileでアップロード、その後done.phpのSELECT * FROM table ORDER BY id DESC LIMIT 1で引っ張ってくることにしました。 今の理解度では精いっぱいです。。 ありがとうございました!
guest

0

こんな感じで

HTML

1<form enctype="multipart/form-data" method="post"> 2<input type="file" name="userfile" accept="image/*"> 3</form> 4<canvas id="canvas"></canvas>

投稿2020/03/06 06:36

yambejp

総合スコア116724

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

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

yambejp

2020/03/06 06:37 編集

window.addEventListener('DOMContentLoaded', function(e){ document.querySelector('[type=file]').addEventListener('change',function(e){ var file = e.target.files[0]; var type=file.type; var blob=new Blob([file],{type:type}); var url = window.URL || window.webkitURL; var image = new Image(); var ratio,width,height; image.src = url.createObjectURL(blob); image.onload=function(e){ const THUMBNAIL_WIDTH = 100; const THUMBNAIL_HEIGHT = 100; if(image.width > image.height){ ratio = image.height/image.width; width = THUMBNAIL_WIDTH; height = parseInt(THUMBNAIL_WIDTH * ratio); } else { ratio = image.width/image.height; width = parseInt(THUMBNAIL_HEIGHT * ratio); height = THUMBNAIL_HEIGHT; } var canvas = document.querySelector('#canvas'); canvas.setAttribute('width', width); canvas.setAttribute('height', height); var ctx = canvas.getContext('2d'); ctx.clearRect(0,0,width,height); ctx.drawImage(image,0,0,image.width,image.height,0,0,width,height); var type = 'image/jpeg'; var dataurl = canvas.toDataURL(type); var bin = atob(dataurl.split(',')[1]); var buffer = new Uint8Array(bin.length); for (var i = 0; i < bin.length; i++) { buffer[i] = bin.charCodeAt(i); } var blob = new Blob([buffer.buffer], {type: type}); const body=new FormData(); body.append("myfile", blob,"test.jpg"); const method="POST"; fetch("done.php",{method,body}).then(res=>res.text()).then(console.log); } }); });
blacktm06

2020/03/09 02:04

わざわざコードを考えていただきありがとうございます! まだまだ私の理解度ではわからないコードだらけですのでひとつずつ調べて試していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問