문제

CakePHP에서 구축 된 클라이언트 현재 웹 사이트와 통합되는 파일 관리 인터페이스를 만들어야합니다.

파일 관리자는 사용자에게 권한이있는 파일 만 볼 수 있도록해야합니다.

사용자는 파일을 업로드 할 수 있으며 (모든 크기의) 다른 사용자가 해당 파일을 다운로드 할 수 있습니다 (허가가 허용되는 경우).

이는 구매할 수있는 많은 파일 관리 시스템에 문제가 없지만 현재 찾을 수있는 것은 현재 로그인 시스템과 통합되지 않습니다. 클라이언트는 사용자가 사용자 CP와 파일에 액세스하기 위해 한 번만 로그인하기를 원합니다. 우리의 유일한 옵션은 파일 관리 인터페이스를 직접 구축하는 것입니다.

PHP를 사용하여 업로드를 허용 해야하는 옵션은 무엇입니까? PHP 업로드 제한을 늘려야한다는 것을 이해하지만 PHP/Apache가 허용하는 천장이 있습니까?

관련이있는 경우 파일이 약 150MB로 캡처 될 가능성이 있지만 파일 크기가 더 큰 상황이있을 수 있습니다.

또한 Linux 서버에서 파일 업로드/컨트롤의 수행 및하지 말아야 할 것은 무엇입니까?

나는 실제 '구체적인'질문이 없다고 생각하지만 어디서부터 시작 해야할지, 그리고 우리가 달릴 전형적인 함정에 대한 조언을 원합니다.

도움이 되었습니까?

해결책

파일 관리는 실제로 매우 쉽습니다. 다음은 올바른 방향을 가리킬 수있는 몇 가지 제안입니다.

우선, 이것이로드 밸런스 웹 서버 상황이라면 파일을 하나의 공통 장소에 놓으려면 복잡성을 조금 강화해야합니다. 이 경우, 저를 핑하고 동일한 상황에 사용하는 슈퍼 라이트 파일 서버/클라이언트를 보내 드리겠습니다.

더 큰 업로드를 허용하기 위해 영향을 미치려는 몇 가지 변수가 있습니다. 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 필드는 적합 할 수 있습니다.

소유자를 저장하는 목적은 파일을 다운로드하고 삭제할 수있는 사람을 제한 할 수 있도록합니다. 다운로드를 보호하는 데 중요합니다.

다음은 샘플 클래스입니다 브라우저에서 파일 업로드를 수락하는 데 사용할 수 있습니다. 물론 적합하도록 수정해야합니다.

다음 코드에 대한 몇 가지 사항이 있습니다. 이것은 응용 프로그램 서버와 파일 서버와 함께 사용되므로 "교체"할 수있는 몇 가지가 있습니다.

  1. 모든 발생 App::CallAPI(...) "동일한 일"을 수행하는 쿼리 또는 쿼리 세트로 교체해야합니다.
  2. 모든 발생 App::$FS->... PHP의 올바른 파일 처리 기능으로 교체해야합니다. move_uploaded_file, readfile, 등...

여기있어. 주어진 사용자가 소유 한 파일을 볼 수있는 기능이 있으며, 파일을 삭제하는 등의 기능이 있습니다. 바닥에 더 많은 설명 ...

<?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']);
        }
    }

}

메모:

이 클래스는 보안을 구현하지 않습니다. 호출자에게 호출하기 전에 인증 된 소유자 _field 및 소유자 _key가 있다고 가정합니다. FileClient::Serve(...) 등...

조금 늦었 으므로이 중 일부가 말이되지 않으면 의견을 남겨주세요. 멋진 저녁을 보내십시오. 이것이 도움이되기를 바랍니다.

추신. 사용자 인터페이스는 간단한 테이블 및 파일 업로드 필드 등이 될 수 있습니다.

다른 팁

다음과 같은 커뮤니티가 제공 한 CakePHP 코드 예제를 살펴 보는 것이 좋습니다.

여기에 좋은 선택이 있습니다. PC 클라이언트와 단일 파일 PHP 서버를 설치해야합니다. 그러나 그것은 빠르게 실행됩니다!

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top