0

Cakephp で構築されたクライアントの現在の Web サイトと統合するファイル管理インターフェイスを作成する必要があります。

ファイル マネージャーは、ユーザーがアクセス許可を持っているファイルのみを表示できるようにする必要があります。

ユーザーは (任意のサイズの) ファイルをアップロードし、他のユーザーにそれらのファイルをダウンロードさせることができます (権限が許可されている場合)。

これは、購入できる多くのファイル管理システムでは問題ありませんが、現在のログイン システムと統合できるものはありません。クライアントは、ユーザーがユーザー CP とそのファイルにアクセスするために 1 回だけログインすることを望んでいます。したがって、私たちの唯一の選択肢は、ファイル管理インターフェイスを自分で構築することです。

PHP を使用したアップロードを許可するために必要なオプションにはどのようなものがありますか? PHP アップロードの上限を引き上げる必要があることは理解していますが、PHP/Apache で許可される上限はありますか?

関連する場合、ファイルは約 150MB で上限になる可能性がありますが、ファイル サイズが大きくなる場合があります。

また、Linuxサーバーでのファイルのアップロード/制御のすべきこととすべきでないことは何ですか?

本当の「具体的な」質問はないと思いますが、どこから始めればよいか、また遭遇する典型的な落とし穴についてアドバイスをお願いします。

4

3 に答える 3

10

実際、ファイル管理は非常に簡単です。ここでは、正しい方向を示す可能性のあるいくつかの提案を示します。

まず第一に、これが負荷分散された Web サーバーの状況である場合、ファイルを 1 つの共通の場所に配置するために、複雑さを少し上げる必要があります。その場合は、私に ping を送信してください。同じ状況で使用している超軽量のファイル サーバー/クライアントを喜んでお送りします。

より大きなアップロードを許可するために、いくつかの変数に影響を与える必要があります。これらの変更を特定のファイルに制限するには、apache ディレクティブを使用することをお勧めします。

<Directory /home/deploy/project/uploader>
    php_value max_upload_size "200M"
    php_value post_max_size "200M"
    php_value max_input_time "1800"

    # this one depends on how much processing you are doing to the file
    php_value memory_limit "32M" 
</Directory>

建築:

各ファイルに関する情報を格納するデータベース テーブルを作成します。

CREATE TABLE `File` (
  `File_MNID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Owner_Field` enum('User.User_ID', 'Resource.Resource_ID') NOT NULL,
  `Owner_Key` int(10) unsigned NOT NULL,
  `ContentType` varchar(64) NOT NULL,
  `Size` int(10) NOT NULL,
  `Hash` varchar(40) NOT NULL,
  `Name` varchar(128) NOT NULL,
  PRIMARY KEY (`File_MNID`),
  KEY `Owner` (`Owner_Field`,`Owner_Key`)
) ENGINE=InnoDB 

Owner_Fieldととは何Owner_Keyですか? どの「エンティティ」がファイルを所有しているかを示す簡単な方法。この特定のケースでは、複数の種類のファイルがアップロードされていました。あなたの場合、単純なUser_IDフィールドで十分かもしれません。

所有者を保存する目的は、ファイルをダウンロードして削除できるユーザーを制限できるようにすることです。これは、ダウンロードを保護するために非常に重要です。

ブラウザからのファイルのアップロードを受け入れるために使用できるサンプル クラスを次に示します。もちろん、それに合わせて変更する必要があります。

次のコードについて注意すべき点がいくつかあります。これは Application Server と File Server で使用されるため、「置き換える」ものがいくつかあります。

  1. の出現はApp::CallAPI(...)、「同じこと」を行うクエリまたは一連のクエリに置き換える必要があります。
  2. が出現する場合は、、、などのApp::$FS->...PHP の正しいファイル処理関数に置き換える必要があります。move_uploaded_filereadfile

ここにあります。ここには、特定のユーザーが所有するファイルを表示したり、ファイルを削除したりできる機能があることに注意してください。下部に詳しい説明...

<?php

class FileClient
{
    public static $DENY     = '/\.ade$|\.adp$|\.asp$|\.bas$|\.bat$|\.chm$|\.cmd$|\.com$|\.cpl$|\.crt$|\.exe$|\.hlp$|\.hta$|\.inf$|\.ins$|\.isp$|\.its$| \.js$|\.jse$|\.lnk$|\.mda$|\.mdb$|\.mde$|\.mdt,\. mdw$|\.mdz$|\.msc$|\.msi$|\.msp$|\.mst$|\.pcd$|\.pif$|\.reg$|\.scr$|\.sct$|\.shs$|\.tmp$|\.url$|\.vb$|\.vbe$|\.vbs$|vsmacros$|\.vss$|\.vst$|\.vsw$|\.ws$|\.wsc$|\.wsf$|\.wsh$/i';

    public static $MAX_SIZE = 5000000;

    public static function SelectList($Owner_Field, $Owner_Key)
    {
        $tmp = App::CallAPI
        (
            'File.List',
            array
            (
                'Owner_Field' => $Owner_Field,
                'Owner_Key' => $Owner_Key,
            )
        );

        return $tmp['Result'];
    }

    public static function HandleUpload($Owner_Field, $Owner_Key, $FieldName)
    {
        $aError = array();

        if(! isset($_FILES[$FieldName]))
            return false;
        elseif(! is_array($_FILES[$FieldName]))
            return false;
        elseif(! $_FILES[$FieldName]['tmp_name'])
            return false;
        elseif($_FILES[$FieldName]['error'])
            return array('An unknown upload error has occured.');

        $sPath = $_FILES[$FieldName]['tmp_name'];
        $sHash = sha1_file($sPath);
        $sType = $_FILES[$FieldName]['type'];
        $nSize = (int) $_FILES[$FieldName]['size'];
        $sName = $_FILES[$FieldName]['name'];

        if(preg_match(self::$DENY, $sName))
        {
            $aError[] = "File type not allowed for security reasons.  If this file must be attached, please add it to a .zip file first...";
        }

        if($nSize > self::$MAX_SIZE)
        {
            $aError[] = 'File too large at $nSize bytes.';
        }

        // Any errors? Bail out.
        if($aError)
        {
            return $aError;
        }


        $File = App::CallAPI
        (
            'File.Insert',
            array
            (
                'Owner_Field'        => $Owner_Field,
                'Owner_Key'            => $Owner_Key,
                'ContentType'        => $sType,
                'Size'                => $nSize,
                'Hash'                => $sHash,
                'Name'                => $sName,
            )
        );

        App::InitFS();
        App::$FS->PutFile("File_" . $File['File_MNID'], $sPath);

        return $File['File_MNID'];

    }

    public static function Serve($Owner_Field, $Owner_Key, $File_MNID)
    {
        //Also returns the name, content-type, and ledger_MNID
        $File    = App::CallAPI
        (
            'File.Select',
            array
            (
                'Owner_Field'     => $Owner_Field,
                'Owner_Key'     => $Owner_Key,
                'File_MNID'     => $File_MNID
            )
        );

        $Name     = 'File_' . $File['File_MNID'] ;

        //Content Header for that given file
        header('Content-disposition: attachment; filename="' . $File['Name'] . '"');
        header("Content-type:'" . $File['ContentType'] . "'");

        App::InitFS();
        #TODO
        echo App::$FS->GetString($Name);

    }

    public static function Delete($Owner_Field, $Owner_Key, $File_MNID)
    {

        $tmp = App::CallAPI
        (
            'File.Delete',
            array
            (
                'Owner_Field' => $Owner_Field,
                'Owner_Key' => $Owner_Key,
                'File_MNID' => $File_MNID,
            )
        );

        App::InitFS();
        App::$FS->DelFile("File_" . $File_MNID);
    }

    public static function DeleteAll($Owner_Field, $Owner_Key)
    {
        foreach(self::SelectList($Owner_Field, $Owner_Key) as $aRow)
        {
            self::Delete($Owner_Field, $Owner_Key, $aRow['File_MNID']);
        }
    }

}

ノート:

このクラスはセキュリティを実装していないことに注意してください。などを呼び出す前に、呼び出し元が認証済みの Owner_Field と Owner_Key を持っていることを前提としていFileClient::Serve(...)ます...

少し遅いので、これの一部が意味をなさない場合は、コメントを残してください. 素晴らしい夜をお過ごしください。これが少しでもお役に立てば幸いです。

PS。ユーザー インターフェイスは、単純なテーブルやファイル アップロード フィールドなどにすることができます。

于 2009-07-02T06:10:31.370 に答える
1

以下のコミュニティ提供の CakePHP コード例を参照することをお勧めします。

于 2009-07-03T09:56:49.940 に答える
0

ここは良い選択です。PC クライアントと単一ファイルの php サーバーをインストールする必要があります。でも走るの速い!

http://the-sync-star.com/

于 2013-01-12T01:17:06.870 に答える