1

ファイルのアップロードに関して本当に厄介な問題があります。

ユーザーは、html ファイル フィールドでファイルを選択できます。フォームを送信すると、このファイルがアップロードされます。

サーバー側では、標準の PHP コード (move_uploaded_file) を使用するだけです。変なことはしません。

すべてが完璧に機能します。

サーバー上のファイルを見ることができ、もう一度ダウンロードすることができます...

ただし、これが機能しない場合もあります。ファイルをアップロードして処理しましたが、エラーは発生しません。

しかし、ファイルはサーバー上に存在しません。

その特定のファイルをアップロードするたびに、エラーは発生しませんが、保存されません。

名前を変更した場合にのみ (たとえば、test.file を tst.file に) アップロードでき、実際に保存されます。

この問題はめったに発生しません。また、名前の変更は常に機能します。しかし、明らかにファイルの名前を変更するようにユーザーに依頼することはできません...

Apache tmp ファイル ディレクトリにアクセスできず、ログや設定にもアクセスできないため、デバッグがさらに困難になります。私はこの特定のサーバーでのみこの問題を抱えており(私は管理していません。アクセスすることさえできません)、この問題を抱えていない多くのサーバーでまったく同じコードを使用しています。

誰かがここで私を助けてくれたり、正しい方向に向けてくれたりしてくれたらありがたいです.

4

4 に答える 4

2

このデバッグコードを追加しようとしています:

echo '<pre>';
print_r($_FILES);
echo '</pre>';

エラー番号が表示されます。http://uk3.php.net/manual/en/features.file-upload.errors.phpで意味を調べることができます。

また、宛先ファイルがまだ存在していないことを確認する価値があるかもしれません。

于 2009-02-25T10:23:04.743 に答える
2

私が最初に考えたのは、ファイルサイズの問題でした。php.ini で、post_max_size または upload_max_filesize が小さすぎる場合、ファイルが消えたように見えるという同様の結果になる可能性があります。Apacheログにエラーが表示されます(アクセスできないと述べています)。

このような場合、$_FILES 配列は単純に空になり、あたかもファイルが到着しなかったかのようになります。GumboJames Hallへの回答は、php が適切なアップロードを報告していることを示しているため、あなたが言及した処理について疑問に思います。

プロセス中にメモリが上限に達したり、スクリプトの実行に時間がかかりすぎたりすると、スクリプトを移動する前にスクリプトが死んでしまう可能性があります。これらを確認する必要があります。

メモリ制限

max_execution_time

max_input_time

それ以外の場合は、apache ログがなければ、ファイル処理スクリプト全体で独自のログ ファイルへの出力を開始することをお勧めします。tmp ファイルで file_exists を試して、ファイルから取得できる情報 (アクセス許可など) を確認してください。

残念ながら、PHP はアップロードが完了するまで関与しません。つまり、アップロード中は多くの情報を取得できません。事後のみです。ホスティング会社に相談してログにアクセスするのが最善の方法かもしれません - たとえ短時間であっても。私の経験では、ログを取得するのに苦労したことはめったにありません-または、少なくともテストを実行している間に技術者にログをチェックしてもらいます(共有サーバーがログを分割しない場合-ばかげているように思えますが、以前見たことがある)。

編集: これらの php 設定を変更できないことは承知していますが、それらがスクリプトの潜在的な問題であるかどうかを確認するために、それらが何であるかを確認することをお勧めします。たとえば、メモリ制限が低いと、アップロードされたファイルのサイズよりも小さい場合、プロセッサ スクリプトが強制終了されます。

于 2009-02-25T11:23:06.707 に答える
1

アップロードが失敗しても、PHP 構文エラーなどと同じ種類のエラーは発生しません。

ただし、ファイルのアップロード ステータスを確認して、ユーザー自身にエラーを報告することはできます。

于 2009-02-25T10:21:00.133 に答える
1
于 2009-07-21T19:01:19.577 に答える