1

Model-View-Controller 構造を使用して Web サイトを開発しています。私のhtmlには、ユーザーがファイルを参照して選択し、ボタンをクリックしてファイルを送信し、コントローラーコードを呼び出すことができるフォームがあります。

if(upload_quotes($_FILES['userfile'])){
    $msg = "Successful file upload";  
    $directory_list = array();

    // get contents of directory here
    // $directory_list = get_directory_contents($directory_list);

    include '../view/processFileUpload.php';
}else{
    $msg = "Unknown error occurred.  Error: ".print_r($_FILES);
    include '../view/errorPage.php';
}

最初の行: upload_quotes() は、モデル コードにある関数です。この関数は、アップロードが成功した場合は true を返し、失敗した場合は false を返します。ディレクトリ一覧を取得する関数呼び出しにもエラーがあるため、コメントアウトしました。2 つのモデル コード スニペット:

function upload_quotes($_FILES){
    $uploadfile = '../../../TestSiteDataFiles/Quotes/'.$_FILES['userfile']['name'];
    if(move_uploaded_file($_FILES['tmp_name'], $uploadfile)){
        return true;
    }else{
        return false;
    }
}

function get_directory_contents($directory_list){
    $current_dir = '../../../TestSiteDataFiles/Quotes/';
    $dir = opendir($current_dir);

    //reads and outputs the directory
    while(false !== ($file = readdir($dir)))
    //strip out the two entries of . and ..
    if($file != "." && $file !=".."){
        array_push($directory_list, $file);
    }
    closedir($dir);
    return $directory_list;
}

processFileUpload.php および errorPage.php ファイルは、それに応じて $msg 変数を出力しますが、成功として出力されることはありません。私は何を間違えたのかを調査するのに何時間も費やしましたが、php に関する私の限られた知識は何の助けにもなりません。ビュー ページには、「不明なエラーが発生しました。エラー: 1 が出力されます。ブラウザにポップアップするエラーは次のとおりです。

警告: move_uploaded_file() [function.move-uploaded-file]: copy() 関数の 2 番目の引数は、17 行目の C:\xampp\htdocs\Test Site\model\model.php のディレクトリにすることはできません

警告: move_uploaded_file() [function.move-uploaded-file]: 'C:\xampp\tmp\php487A.tmp' を C:\ の '../../../TestSiteDataFiles/Images/' に移動できませんxampp\htdocs\Test Site\model\model.php 行 17 配列 ( [name] => Managerial Accounting Davers Connect.txt [type] => text/plain [tmp_name] => C:\xampp\tmp\php487A. tmp [エラー] => 0 [サイズ] => 55 )

upload_quotes()毎回 false として返されるため、モデル コード ( ) がエラーの原因であるように見えます。関数がget_directory_contents()実行される可能性はありませんが、正しい結果も出力されません。

私はすべての提案に感謝し、あなたの意見に感謝します.

4

2 に答える 2

3

$_FILESパラメータとして関数に渡すことで、実際の$_FILESスーパーグローバルでファイル情報のソースを混乱させました。関数内でアクセス$_FILES['userfile']['name']し、関数に渡す$_FILES['userfile']ため、name キーが定義されず、ディレクトリ エラーが発生します。

ユーザー入力ファイル名を使用してファイルシステムにファイルを保存することは非常に危険です。代わりに、固有のファイル名を作成することをお勧めします。からの元の入力ファイル名$_FILES[]['name']は、データベースに保存し、表示するメタデータとしてディスク上のファイルに関連付けるのに役立ちますが、ディスクへの保存には使用しないでください。

// Use a different variable name. I've replaced it with $fileinfo
function upload_quotes($fileinfo){

    // Don't use the original filename to store it. Create one instead.
    $fname = uniqid();
    $finfo = pathinfo($fileinfo['name']);
    // Append the user's file extension to a random filename
    $fname .= "." . $finfo['extension'];

    $uploadfile = '../../../TestSiteDataFiles/Quotes/'.$fname;

    // Don't attempt to move the file unless its error container is empty
    if(empty($fileinfo['error']) && move_uploaded_file($fileinfo['tmp_name'], $uploadfile)){
        return true;
    }else{
        return false;
    }
}

アップデート

配列がスコープ外で定義されているため、get_directory_contents()関数は失敗します。$directory_list関数を呼び出す前に配列として定義する必要はありません。代わりに内部で実行してください:

function get_directory_contents($directory_list){
    $current_dir = '../../../TestSiteDataFiles/Quotes/';
    $dir = opendir($current_dir);

    // Define $directory_list as an array IN HERE
    $directory_list = array();

    //reads and outputs the directory
    while(false !== ($file = readdir($dir)))
    //strip out the two entries of . and ..
    if($file != "." && $file !=".."){
        array_push($directory_list, $file);
    }
    closedir($dir);
    return $directory_list;
}

配列追加表記 array_push()の代わりに使用したため、これは本当に問題でした。最初のパラメーターとして既存の配列を使用する必要があり、それ自体は作成しません。[]array_push()

// Would have worked since the array would get initialized if it didn't exist in scope already.
$directory_list[] = $file;
于 2012-04-10T02:18:45.410 に答える
0

アップロード関数で変数名の不一致があることがわかると思います。

最初は持っています$_FILES['userfile']['name']が、move_uploaded_file使用する機能では$_FILES['tmp_name']

おそらく、変数に期待するものが含まれていることを確認してください。おそらく、それらが空の文字列に評価されていることに気付くでしょう。設定しているパスと連結すると、ディレクトリが設定されます。

編集:実際には、関数に呼び出さ$_FILESれた変数も渡していますが、スーパーグローバルであるため、すべてのスコープ(つまりどこでも)で使用できます。の引数(およびそれに応じて依存する変数)の名前を変更すると、問題が解決する場合があります。upload_quotes$_FILESupload_quotes

于 2012-04-10T02:16:34.960 に答える