CakePHPでフォームにおいての大きいファイルサイズのアップロードが

うまくいきません。

300KB程度のファイルならばアップロードできるのですが
500KB以上になると「送信ボタン」をクリックすると真っ白な画面になり、
エラーも表示されず処理も完了しませんでした。

ググッたら

http://aoyama.accata.com/archives/2072

↑のような情報も見つかりましたので.htaccessに設定を
追加したのですが改善しませんでした。

ちなみにアップロードには「CLASS.UPLOAD.PHP」というライブラリを
使用しており、同じレンタルサーバーでCakePHPを使わずに構築した場合には
5MB以上のファイルのアップロードモ正常に行うことができました。

ググッても見つからなかったのですが、
CakePHPにファイル容量を制限するような設定があるのでしょうか?

ご教授のほど宜しくお願い致します。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/05 14:15:27
  • 終了:2010/03/06 16:55:53

ベストアンサー

id:tdoi No.3

tdoi回答回数174ベストアンサー獲得回数752010/03/05 16:15:33

ポイント100pt

コメント欄が開いていないので、こちらで失礼します。

まず、状況を知りたいのですが、

1.どんなフォームを作成している?

viewのテンプレートでどのようなフォームを書いているか?そして、その結果どのようなHTMLが生成されているか?を確認してみてください。

2.データは渡ってきている?

どの時点まで正しく動作しているのでしょうか?画面が真っ白になるだけでは分からないので、実際にアクションが実行されているか?あるいは、アクションに渡ってきた時点でアップロードされたデータはあるか?などを確認してみてください。

prして、exitするようなコードを書き足しながらどこで落ちているのかも確認できるでしょう。

3.サーバログは確認しましたか?

もし、上限を超えてのアップロードであればログに記録が残るでしょう。確認してみてください。

4.デバッグモードですか?

config/core.phpのDEBUGレベルが0になっていませんか?2とかにでもしてあげれば、真っ白じゃなくエラーがでるかもしれません。

これらを調べていくと、答えもでるのではないかと思いますし、これらが分かれば、別のアイディアも出せるでしょう。

何かの参考になれば。

http://dummy

id:gelgelgel

>1.どんなフォームを作成している?

>viewのテンプレートでどのようなフォームを書いているか?そして、その結果どのようなHTMLが生成されているか?を確認してみてください。

保存が正常に完了した場合にフラグを切り替え、入力と完了画面を1枚のテンプレートで行っています。

結果は本当に真っ白です。ページもローカルに保存して確認しましたが何も無いです。

繰り返しになりますが、容量の小さいファイルアップロードした場合は正常に動作します。

>2.データは渡ってきている?

>どの時点まで正しく動作しているのでしょうか?画面が真っ白になるだけでは分からないので、実際にアクションが実行されているか?あるいは、アクショ

>ンに渡ってきた時点でアップロードされたデータはあるか?などを確認してみてください。

アクションは実行されているかと思います。どの時点まで正しく動作しているか確認したところ「class.upload.php」を用い、リサイズしてアップロードするためのコンポーネント内の

$handle->Process($path);(アップロードの実行)

で止まっているようです。該当箇所を削除すると正常に完了画面まで移行できました。(当然ながらファイルのアップロードはできていませんでしたが・・・&さんざんCakePHPの方に原因があるように書きましたがこちらのようでした。すみません。)

念のためkm1967さんに教えて頂いた

$handle->file_max_size = '50000000';

というのも記述しましたがやっぱり出来ませんでした。

書き忘れましたがフォームのアクションを実行する前に

http://blog.flup.jp/2007/07/07/php_image_realtime_preview/

↑を使って画像プレビューを行っておりその時点でこちらでは大きいファイルもサーバーにアップロード出来ています。

>3.サーバログは確認しましたか?

>もし、上限を超えてのアップロードであればログに記録が残るでしょう。確認してみてください。

こちらはちょっと分からないので確認してみます。


>4.デバッグモードですか?

デバックモードは2になっています。

2010/03/05 17:32:01

その他の回答(3件)

id:showyou No.1

showyou回答回数96ベストアンサー獲得回数102010/03/05 14:28:50

ポイント10pt

.htaccessではなくphp.iniをちゃんと書き換えましたか?


ここのドキュメント見る限りでも

「file_max_size sets maximum upload size (default: upload_max_filesize from php.ini)」

とありますが。

http://www.verot.net/res/sources/class.upload.html

id:gelgelgel

ご回答ありがとうございます。

レンタルなのでphp.iniはいじれないので.htaccessに設定を書き込んだのですが

これではダメなのでしょうか?

他のサーバーでは上記のような設定で「class.upload.php」の動作自体はうまく行っているので、

CakePHP側に問題があるとおもうのですが違うのでしょうか?

2010/03/05 15:48:06
id:km1967 No.2

km1967回答回数541ベストアンサー獲得回数402010/03/05 14:42:03

ポイント10pt

上限 500KBなら下記のように設定すること

$handle->file_max_size = '512000';

http://www.happyquality.com/2009/08/26/1034.htm

id:gelgelgel

ご回答ありがとうございます。

質問内容がわかりにくかったかも知れませんが、アップロードに上限を設けたいのではなく

『もっと大きいサイズのファイルをアップロードしたい』ということです。

『class.upload.php』については質問内容にもある通り、同レンタルサーバーのCakePHPを使用しなければ

5MB以上のファイルも正常にアップロード出来ていますのでこちらが原因ではないと思います。

CakePHPには容量を制限するような設定はないのでしょうか?

2010/03/05 15:46:41
id:tdoi No.3

tdoi回答回数174ベストアンサー獲得回数752010/03/05 16:15:33ここでベストアンサー

ポイント100pt

コメント欄が開いていないので、こちらで失礼します。

まず、状況を知りたいのですが、

1.どんなフォームを作成している?

viewのテンプレートでどのようなフォームを書いているか?そして、その結果どのようなHTMLが生成されているか?を確認してみてください。

2.データは渡ってきている?

どの時点まで正しく動作しているのでしょうか?画面が真っ白になるだけでは分からないので、実際にアクションが実行されているか?あるいは、アクションに渡ってきた時点でアップロードされたデータはあるか?などを確認してみてください。

prして、exitするようなコードを書き足しながらどこで落ちているのかも確認できるでしょう。

3.サーバログは確認しましたか?

もし、上限を超えてのアップロードであればログに記録が残るでしょう。確認してみてください。

4.デバッグモードですか?

config/core.phpのDEBUGレベルが0になっていませんか?2とかにでもしてあげれば、真っ白じゃなくエラーがでるかもしれません。

これらを調べていくと、答えもでるのではないかと思いますし、これらが分かれば、別のアイディアも出せるでしょう。

何かの参考になれば。

http://dummy

id:gelgelgel

>1.どんなフォームを作成している?

>viewのテンプレートでどのようなフォームを書いているか?そして、その結果どのようなHTMLが生成されているか?を確認してみてください。

保存が正常に完了した場合にフラグを切り替え、入力と完了画面を1枚のテンプレートで行っています。

結果は本当に真っ白です。ページもローカルに保存して確認しましたが何も無いです。

繰り返しになりますが、容量の小さいファイルアップロードした場合は正常に動作します。

>2.データは渡ってきている?

>どの時点まで正しく動作しているのでしょうか?画面が真っ白になるだけでは分からないので、実際にアクションが実行されているか?あるいは、アクショ

>ンに渡ってきた時点でアップロードされたデータはあるか?などを確認してみてください。

アクションは実行されているかと思います。どの時点まで正しく動作しているか確認したところ「class.upload.php」を用い、リサイズしてアップロードするためのコンポーネント内の

$handle->Process($path);(アップロードの実行)

で止まっているようです。該当箇所を削除すると正常に完了画面まで移行できました。(当然ながらファイルのアップロードはできていませんでしたが・・・&さんざんCakePHPの方に原因があるように書きましたがこちらのようでした。すみません。)

念のためkm1967さんに教えて頂いた

$handle->file_max_size = '50000000';

というのも記述しましたがやっぱり出来ませんでした。

書き忘れましたがフォームのアクションを実行する前に

http://blog.flup.jp/2007/07/07/php_image_realtime_preview/

↑を使って画像プレビューを行っておりその時点でこちらでは大きいファイルもサーバーにアップロード出来ています。

>3.サーバログは確認しましたか?

>もし、上限を超えてのアップロードであればログに記録が残るでしょう。確認してみてください。

こちらはちょっと分からないので確認してみます。


>4.デバッグモードですか?

デバックモードは2になっています。

2010/03/05 17:32:01
id:Km1967 No.4

Km1967回答回数224ベストアンサー獲得回数352010/03/06 00:20:19

まずはお願いなのですが、

どのようなレンタルサーバを借りているのか、契約コースは何か、

どのように設置したのか、どのように設定したのか、

何も判らないとアドバイスは難しくなりますので、必須だとご記憶ください。

不適当な回答が集まっても混乱をきたしますから、私への返信欄か、

コメント欄に、書き加えておくことを勧めます。


http://cakephp.jp/doc/ch03s04.html

  • id:km1967
    >CakePHPには容量を制限するような設定はないのでしょうか?
    いや、だから、あるんだってば。
    No.2の回答とURLをちゃんと読んでくれました?
    Uploadクラスのfile_max_sizeが上限設定になっているんですよ!
  • id:tdoi
    > km1967さん
    横から失礼。
    UploadクラスはCakePHPとは直接関係ないのでは?
    CakePHP経由ではなくてUploadクラスを使うと動作しているということなので、その設定ではないのかと思うのですが。
    もちろん、同じように設定したつもりで、CakePHPから利用するコードと、使わなかったときのコードが違う可能性はありますけどね。
  • id:tdoi
    なんとなく状況が分かってきました。
    $handle->Process($path);を呼び出しているアクション内で、

    pr ($_FILE);
    exit;

    とかを先頭に書いてみて、実際に動作している場合と比較すると分かるような気がします。
    あと、HTMLのソースと言ったのは、呼び出しごではなくフォームの方のHTMLです。
    こちらも、一度見てみることをお勧めします。
  • id:gelgelgel
    >km1967さん

    私なりには理解したつもりでした。
    「file_max_size」は上限を設けたいときに使用するもので、
    記述がなければ「上限なし」という設定になるかと思います。

    他環境で使っているときは特に記述がなくても問題ありませんでした。
  • id:gelgelgel
    >tdoiさん

    たびたびのご回答ありがとうございます

    pr ($_FILE); → print_r($_FILES['xxx']);

    ということで宜しいでしょうか?(正直精通していないものであまり略称とかはわかっておりません・・)
    試しましたが

    ▽失敗
    Array ( [name] => 1MBの写真.jpg [type] => image/jpeg [tmp_name] => /tmp/phpR9zOmt [error] => 0 [size] => 1064506 )
    ▽成功
    Array ( [name] => 230KBの写真.jpg [type] => image/jpeg [tmp_name] => /tmp/phpRauEAr [error] => 0 [size] => 234737 )

    という結果でした。

    呼び出し前のフォームは

    <input type="file" name="upload1" id="upload1" onchange="imgPreview('1','XXX')" value="" />

    となっていてファイルを読み込みプレビューすることで

    <input type="hidden" name="data[XXX][image1]" id="image1" value="自動で生成されたファイル名" />

    というソースが挿入されます。

    宜しくお願い致します。
  • id:tdoi
    えっと、説明不足ですみません。

    prはCakePHPのユーティリティ関数で、要はprint_rです。
    で、フォームのname属性の関係でおかしくなっているのかなと思ったんですが、そうではないようですね。

    そこで、このコメントを見て気になったのですが、プレビューをどのように実行しているか見ていないのですが、上記のような$_FILEの値が観測されたのは、プレビュー後の実行の際なんですよね?つまり、ファイルは2回アップロードする仕組みなのでしょうか?
  • id:tdoi
    あとは、$handle-Process()の中で落ちていることが分かっているのなら、Process関数の中に手を加えて、どこまで実行されているかを確かめれば、原因もおのずと分かると思いますよ。
  • id:gelgelgel
    tdoiさん

    >prはCakePHPのユーティリティ関数で、要はprint_rです。
    >で、フォームのname属性の関係でおかしくなっているのかなと思ったんですが、そうではないようですね。

    ご説明ありがとうございます。
    容量の小さいファイルでは問題なく動いていますので、そういうことではないと思います。

    >そこで、このコメントを見て気になったのですが、プレビューをどのように実行しているか見ていないのですが、
    >上記のような$_FILEの値が観測されたのは、プレビュー後の実行の際なんですよね?

    はい、その通りです。

    >つまり、ファイルは2回アップロードする仕組みなのでしょうか?

    ご説明不足でしたが、2回アップロードする仕組みになっています。
    1回目はそのままアップロードし、2回目は縮小してまた別の場所にアップロードするようにしています。

    >あとは、$handle-Process()の中で落ちていることが分かっているのなら、
    >Process関数の中に手を加えて、どこまで実行されているかを確かめれば、原因もおのずと分かると思いますよ。

    アドバイスありがとうございます。もう一度そのあたりを洗ってみます。

  • id:gelgelgel
    tdoiさん

    おかげさまで解決致しました!!
    原因はPHPのメモリ不足でした。Process関数を洗ってみたところ

    $image_src = @imagecreatefromjpeg($this->file_src_pathname);

    で止まっておりました。「@」があったためエラーが表示されなかったようです。「@」を外すと

    Fatal error: Allowed memory size of ****** bytes exhausted (tried to allocate ****** bytes)

    と表示され「.htaccess」に

    php_value memory_limit 100M

    と記述することで正常に動作するようになりました。
    本当にありがとうございました!!


この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません