1

CakePHP アプリケーションにアップロード機能を組み込もうとしています。生の PHP プロジェクト用に以前にビルドしたことがあり、そのコードが機能することがわかっているため、そのコードを再利用することにしました。コードは次のとおりです。

    $allowed_filetypes = array('.jpg','.gif','.bmp','.png');
    $max_filesize = 1000000; // Maximum filesize in BYTES
    $upload_path = './files/';

    $filename = $_FILES['userfile']['name'];
    $desiredname = $_POST['desiredname'];
    $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1);

    $savedfile = $desiredname.$ext;

    // Check if the filetype is allowed, if not DIE and inform the user.
    if(!in_array($ext,$allowed_filetypes))
        die('The file you attempted to upload is not allowed.');

    // Now check the filesize, if it is too large then DIE and inform the user.
    if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)
        die('The file you attempted to upload is too large.');

    // Check if we can upload to the specified path, if not DIE and inform the user.
    if(!is_writable($upload_path))
        die('You cannot upload to the specified directory, please CHMOD it to 777.');

    // Upload the file to your specified path.
    if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $savedfile))
        echo 'Your file upload was successful, view the file <a href="' . $upload_path . $savedfile . '" title="Your File">here</a>'; // It worked.
    else
        echo 'There was an error during the file upload.  Please try again.'; // It failed :(.

アップロードしたいページのコントローラーにこのコードを入れました。次のようなフォームを生成するために、CakePHP の FormHelper を使用しました。

    <?php 
        echo $this->Form->create('Customer', array(
            'class' => 'form-horizontal',
            'action' => 'add',
            'enctype' => 'multipart/form-data'
        ));

        echo $this->Form->input('filename', array(
            'type' => 'text',
            'label' => 'Filename',
            'class' => 'span5'
        ));
        echo $this->Form->input('file', array(
            'between' => '<br />',
            'type' => 'file'
        ));
        echo $this->Form->end('Save Changes', array(
            'label' => false,
            'type' => 'submit',
            'class' => 'btn btn-primary'
        ));

        echo $this->Form->end();
     ?>

このプロジェクトで使用されているフォームの変更を反映するために、古いコードのフィールドへの参照を変更しました。ただし、フォームを送信すると、次のエラーが表示されます。

通知 (8): 未定義のインデックス: CustomerFile [APP\Controller\CustomersController.php、148 行目]

通知 (8): 未定義のインデックス: CustomerFilename [APP\Controller\CustomersController.php、149 行目]

コントローラーのコードで、フォーム フィールドを (再び) 次のように変更しました。

$filename = $this->request->data['CustomerFile']['name'];
$desiredname = $this->request->data['CustomerFilename'];

しかし、エラーはまだ発生します。フォームフィールドが適切に参照されていないと推測していますが、コードを使用して適切に参照したと思っていました$this->requestが、明らかに機能していません。誰にもアイデアはありますか?

4

2 に答える 2

3

ケーキ以外の主な問題:

  1. を使用する代わりに、独自のファイル名操作操作をロールするpathinfo()
  2. アップロードの適格性を判断するための、ユーザー提供のファイル名によるフィルタリング。ユーザーから送信されたものを絶対に信用しないでください。fileinfoなどのサーバー側のMIMEタイピング操作を使用します
  3. アップロードが成功したと想定し、成功/失敗をチェックする前にそのファイルに対してサーバー側の操作を実行します。常に最初に['error']コードを確認してください。コードはここに文書化されています:http://php.net/manual/en/features.file-upload.errors.php
  4. アップロード後のファイルサイズ制限を使用する-php.iniで制限を設定することをお勧めします。これにより、後で無視されるバイトで帯域幅を制限する前に、サーバーがアップロードを中止できるようになります。この['error']コードを使用して、ファイルサイズ制限違反が原因でアップロードが中止されたかどうかを判断できます。
  5. セキュリティチェックを一切行わずに、ユーザーがターゲットファイル名を指定できるようにし、悪意のあるユーザーがそのファイル名にパスを指定できるようにし、サーバー上の任意のファイルに落書きできるようにします。
于 2012-05-12T23:01:58.960 に答える
0

ページ モデル:

    public function beforeSave() {
    if (!empty($this->data['Page']['image']['name'])) {

        $this->data['Page']['image'] = time() . '-Featured-' . $this->data['Page']['image']['name'];
        $this->data['Page']['alias'] = $this->data['Page']['title'];
        $this->data['Page']['publish'] = date("y.m.d, h:i:s");
        $this->data['Page']['update'] = date("y.m.d, h:i:s");
        $this->data['Page']['posttype'] = 'page';

        return true;
    } else {
        if($this->action == 'edit'){
            $this->data['Page']['image'] = $this->data['Page']['img'];
            $this->data['Page']['alias'] = $this->data['Page']['title'];
            $this->data['Page']['publish'] = date("y.m.d, h:i:s");
            $this->data['Page']['update'] = date("y.m.d, h:i:s");
            $this->data['Page']['posttype'] = 'page';
            return true;
        }
    }

    return true;
}

public function fileExtension ($data) {
    if($this->data['Page']['image']['type'] != 'image/jpeg'){
        $this->invalidate('image','');
        return false;
    }
    return true;
}

ページ コントローラー:

    public function add() {

    if (!empty($this->request->data)) {
        $menus = $this->Page->save($this->request->data);
        if (!empty($menus)) {
            move_uploaded_file($this->data['Page']['image']['tmp_name'], $_SERVER['DOCUMENT_ROOT'] . '/app/webroot/img/test/' . $this->data['Page']['image']['name']);
            $filename = $_SERVER['DOCUMENT_ROOT'] . '/app/webroot/img/test/' . $this->data['Page']['image']['name'];
            list($width,$height) = getimagesize($filename);
            $percent = 20000/$width;
            $newwidth = $width/100*$percent;
            $newheight = $height/100*$percent;
            $thumb = imagecreatetruecolor($newwidth, $newheight);
            $source = imagecreatefromjpeg($filename);
            imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
            imagejpeg($thumb, $_SERVER['DOCUMENT_ROOT'] . '/app/webroot/img/test/' .  time() . '-Featured-' . $this->data['Page']['image']['name'],100);
            $this->Session->setFlash('Səhifə əlavə olundu', 'default', array('class' => 'alert alert-success'));
        }
        $this->redirect(array('action'=>'add'));
    }
}
于 2012-05-13T09:25:23.170 に答える