2012-09-21 4 views
19

私はValums file uploaderを使ってプログレスバーを使ってWebページからファイルをアップロードしています。ほとんどすべて正常に動作しますが、ファイルが保存されているデフォルトのtmpディレクトリを変更することはできませんアップロード中。 /tmpが4  メガバイトとユーザーに限られ、そのサイズは10  メガバイトの周りにファイルをアップロードされているRAMディスクにマウントされているためPHP tmpディレクトリを設定する - PHPアップロードが正常に動作しない

ファイルは、/tmpディレクトリ/uploadディレクトリにしていないデフォルトのシステムに格納する必要があります。

多くのウェブページを検索しましたが、解決策はありませんでした。私はphp.iniに一時ディレクトリを設定している :

upload_tmp_dir =/upload 

私は/uploadディレクトリへのアクセス権を設定した、とApacheは、ファイルの所有者なので、ディレクトリは間違いなくPHPによって書き込み可能です。

ファイルのアップロード先のパスを/uploadに設定しました。このディレクトリにもアップロード後にファイルを保存したいからです。最終的に小さなファイルが正常にアップロードされていますが、4   MB以上のファイルはアップロードできません。アップロード時にファイルが/tmpに保存されているということが私の考えです。確かに、私はsys_get_temp_dir()でそれをチェックしました。結果は/tmpでした.- PHPはphp.iniディレクティブを無視します。あるいは、アップロード中にファイルが保存される場所を設定する他の方法があります。

ああ、最後の情報:open_basedirが設定されていないため、ディスクへのPHPアクセスはファイルアクセス権によってのみ制限されます。

+2

ます(この愚かな質問には申し訳ありません)、サーバーを再起動しましたか? – soju

+0

愚かな質問はありません。ちょうど愚かな答えです:)。はい、私は問題を解決しようとしている間に何度もやり遂げました。 – Wookie88

+0

phpがcgi modとしてインストールされていないことを確認しましたか? (doc:*ここで指定したディレクトリが書き込み可能でない場合、PHPはシステムのデフォルトの一時ディレクトリ*に戻ります)* – soju

答えて

50

ここに記載されている問題は私がかなり前に解決しましたが、アップロードがうまくいかない主な理由は何かを覚えていません。アップロードがうまくいくように修正が必要なものが複数ありました。私は同様の問題を抱えている他の人を助けるかもしれないチェックリストを作成しました。できるだけ参考にするために編集します。以前私がチャットで言ったように、私は組み込みシステムに取り組んでいたので、埋め込まれていないシステムではいくつかの点が飛ばされるかもしれません。

  • upload_tmp_dirをphp.iniにチェックしてください。これはPHPがアップロード時に一時ファイルを保存するディレクトリです。

  • open_basedirをphp.iniにチェックしてください。定義されている場合、PHPの読み取り/書き込み権限が指定されたパスとそのサブディレクトリに制限されます。 upload_tmp_dirがこのパスの内側にあることを確認してください。

  • post_max_sizeをphp.iniにチェックしてください。アップロードするファイルが20Mバイトの場合は、post_max_size = 21Mのようにもう少し大きいものを試してみてください。これは、アップロード中におそらく使用しているPOSTメッセージの最大サイズを定義します。

  • upload_max_filesizeをphp.iniにチェックしてください。これは、アップロードできる最大のファイルを指定します。

  • memory_limitをphp.iniにチェックしてください。これは、スクリプトが消費するメモリの最大量です。アップロードサイズよりも低くすることはできません(正直言って、PHPはおそらく一時ファイルのコピー中にバッファリングしています)。

  • WebサーバーでPHPが使用している正しいphp.iniファイルを確認していることを確認してください。最善の解決策は、ここで説明するディレクティブでスクリプトを実行することであるhttp://php.net/manual/en/function.php-ini-loaded-file.phpphp_ini_loaded_file機能)(それを行う方法をここで参照してください:How to check what user php is running as?を)として実行されますどのようなユーザーのphp

  • チェック。私は別のディストリビューションとサーバーで作業しました。場合によってはapacheですが、場合によってはrootになることもあります。とにかく、このユーザーがアップロードしている一時ディレクトリとディレクトリに読み書きする権限を持っていることを確認してください。あなたがサブディレクトリに(例えば/dir1/dir2/ -check両方dir1dir2をアップロードする場合には、それがフラッシュカードに保存されているので、あなたは時々、ルートファイルシステムへの書き込みを制限する必要があります。組み込みプラットフォームで

  • をパス内のすべてのディレクトリをチェックし、

  • PHP> 5.4セッションに基づいてアップロードの監視に重大な問題がありました(説明されているように)このカードの寿命を延ばすためにスクリプトを使用しています。ここではhttp://www.dzone.com/snippets/very-simple-php-file-upload)のように単純なものを試してみてください。それが機能すれば、より洗練されたメカを試すことができますanisms。

  • php.iniで何か変更を加えた場合は、サーバーを再起動して構成を再ロードするようにしてください。

+0

良いチェックリスト - ありがとう! – Olaf

+0

'memory_limit'はアップロードには問題ありません。 http://stackoverflow.com/a/5828654/956397 – PiTheNumber

+0

を参照してください。PHPでファイル全体を読む予定がない場合は、そうです。しかし、この点をチェックリストに入れて、より普遍的なものにすることは良いことです。 – Wookie88

1

私は 私のソリューションは、PHPスクリプトが含まれていたフォルダに、php.iniのファイルを変更することでした...長い時間のために、この問題と格闘。これは重要でした。ルートでphp.iniを変更しても問題は解決しませんでした(細かい制御のために各フォルダにphp.iniがあります)。 私のphp.iniの関連するエントリはこのように見えた....(にoutput_bufferingはおそらく、この問題には必要ありません)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M 
関連する問題