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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

2393閲覧

Cakephp 画像のアップロードで容量制限

sagessecourage

総合スコア8

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/08/29 16:52

編集2016/08/30 10:46

###前提・実現したいこと
PHP(CakePHP)で写真をアップロードできるシステムを作っています。
「選択」をクリックして画像選択時に、300KB以上の画像がアップロードされた場合は、アラートを表示して選択ができないようにしたいです。
選択できる画像は15枚です。
15枚選択して、submitした時に、たった1枚の画像容量オーバーによって全ての選択がクリアされてしまう。という状態は絶対に避けたいです。

希望する動作に近いものは書けたのですが、1度だけしか実行されず、2度目の選択からは300KB以上のファイルも選択できるようになってしまいます。

何度選択しても、300KBの画像アップロードを判別するfunctionを作るにはどうしたらよいでしょうか?

###該当のソースコード

window.onload = function(){ $("#filupload").addEventListener('change', afile_changeHandler); } function afile_changeHandler(evt){ var files = evt.target.files; var s = ""; for(var i = 0; i < files.length; i++){ var f = files[i]; s += 'name;' + escape(f.name) + '<br>' + 'size;' + f.size + ' Bytes<br>' + 'type;' + f.type + '<br>' + 'date;' + f.lastModifiedDate + '<hr>'; } if (f.size > 300000) { alert("容量が大きすぎます"); var file = document.getElementById("filupload"); file.parentNode.innerHTML = file.parentNode.innerHTML; document.getElementById("file_value").value=""; } $('#info').innerHTML = s; } echo '<input type="file" id="filupload" accept="image/png,image/gif,image/jpeg" multiple="multiple" onchange="select_file(this);" >'; echo $this->Form->input("file_value_",array('id'=>"file_value_.$i.", 'label'=>false, 'div'=>false, 'size'=>'25', 'disabled'=>'disabled', 'style'=>'width: 100%; border: none;'));

###試したこと
submitしてControllerで処理をしようとしたのですが、選択した画像のパスが消えてしまい、再度選択しなおさなければならなかったので、javascriptかjqueryで処理することにしました。

###補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

kei344

2016/08/29 16:54

コード最終行の後に```(バッククオート3つ)が足りません。記入エリアの右部分あたりにリアルタイムに結果が表示されていると思うので、そこを見ながら調整してください。
sagessecourage

2016/08/30 09:52

ご指摘ありがとうございます。修正致しました。
kei344

2016/08/30 09:54

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
sagessecourage

2016/08/30 10:47

不慣れで申し訳ありません。修正致しました。
guest

回答1

0

コードにいろいろ不明点があるんですが、
最後の2行にechoがありますけど、これはphp?

jQueryだと思いますが

$("#filupload").addEventListener('change', afile_changeHandler);

ではなく

$("#filupload").on('change', afile_changeHandler);

ですね。

イベントをここで設定していますが、

echo '<input type="file" id="filupload" (省略) onchange="select_file(this);" >';

と、ここにもイベントハンドラ(select_file)が設定されています。
(それはそれで必要なのかもしれませんが、質問上ではselect_fileが何かわからなかったので。)

また、

echo $this->Form->input("file_value_",array('id'=>"file_value_.$i.",

と、idが file_value_X の形式であるように見えますが、

if (f.size > 300000) { alert("容量が大きすぎます"); var file = document.getElementById("filupload"); file.parentNode.innerHTML = file.parentNode.innerHTML; document.getElementById("file_value").value=""; }

では、file_valueとなっています。(2回目以降実行されないのはたぶんこれが原因)

ブラウザのコンソールにもエラーが表示されます。確認してみてください。

投稿2016/08/29 23:27

flied_onion

総合スコア2604

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

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

sagessecourage

2016/08/30 10:50

addEventListenerをonに変更すると動作しなくなるようです。 同じ画像を選択しても二度目はif (f.size > 300000) { 以下が動作していません。 onchange="select_file(this);"とfile_valuは別の関数で必要です。
flied_onion

2016/08/30 11:53

Consoleには何も出ていませんか? phpと混ざっていないHTMLなどもないと、同じイベントに設定している様なので判断できません。 onに変更すると動作しなくなるということは `$("#filupload")` はjQueryを使っているわけではないということですか?(私がためしたjQueryだと、addEventListenerが無いのでエラーになるので)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問