PHP Dosya Yönetim Sistemi

3 Cevap php

Biz CakePHP'de üzerine inşa müşteriler mevcut web sitesi ile entegre bir dosya yönetim arabirimi oluşturmak gerekir.

Dosya yöneticisi, yalnızca kullanıcıların onlar da izinlere sahip dosyaları görelim gerekir.

Kullanıcı (her boyutta) dosya yüklemek ve (izinler izin verirseniz) Diğer kullanıcıların bu dosyaları indirmek için mümkün olacak.

Bu, satın alabilirsiniz, ancak ben bulabilirim yok sistemde mevcut günlüğü ile entegre olacak birçok dosya yönetim sistemleri için sorun değildir. Istemci yalnızca kullanıcıların kendi kullanıcı CP ve dosyalara erişmek için bir kez oturum istiyor. Yani kadarıyla ben gördüğünüz gibi bizim tek seçenek bir dosya yönetim kendimizi arayüz inşa etmektir.

Biz yüklenenler PHP kullanarak izin vermek zorunda seçeneklerden bazıları nelerdir? Ben php upload limitini artırmak gerektiğini anlıyorum, ama php / apache sağlayacak bir tavan var?

Dosyaları büyük olasılıkla ancak dosya boyutları büyük olacak durumlar olabilir, yani ilgili ise yaklaşık 150MB dışarı örter.

Ayrıca Linux sunucu üzerinde dosya yükleme / kontrol Yapılması ve Yapılmaması Gerekenler nelerdir?

Ben hiçbir gerçek 'özel' soru var ama başlamak ve biz içine çalışacak tipik tuzaklar bazı nerede bazı tavsiyelerde istiyorum varsayalım.

3 Cevap

Dosya yönetimi aslında oldukça kolaydır. Burada doğru yönde bir işaret olabilecek bazı öneriler.

Bu bir yük dengeli bir web sunucusu durum ise, her şeyden önce, tek ortak bir yerde dosyaları koymak için karmaşıklığını biraz hızlandırmaya gerekir. Bu durum buysa, bana ping ve sana biz aynı durum için kullanmak bizim süper-hafif dosya sunucusu / istemci göndermek için mutluluk duyarız.

Daha büyük yüklenenler izin için etkilemek istediğiniz bir kaç değişken vardır. Belirli bir dosya için bu değişiklikleri sınırlamak için apache yönergeleri kullanmanızı öneririz:

<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>

Architecture:

Her dosya hakkında bazı bilgileri depolayan bir veritabanı tablosu oluşturun.

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

Ne Owner_Field ve Owner_Key? "Varlık" dosya sahibi ne söylemek için basit bir yolu. Bu özel durumda yükleniyor dosyaların birden çok türleri vardı. Senin durumunda, basit bir User_ID alan yeterli olabilir.

Kim dosyayı indirmek ve silebilirsiniz kısıtlamak böylece sahibi saklama amacı budur. Bu indirme korumak için çok önemli olacak.

Here is a sample class o tarayıcıdan dosya yüklemeleri kabul için kullanılabilir. Sen tabii ki, uyacak şekilde değiştirmeniz gerekir.

Aşağıdaki kodda dikkat edilmesi gereken birkaç şey vardır. Bu bir Application Server ve File Server ile kullanılan bu yana, "değiştirmek" için bir kaç şey vardır.

  1. Herhangi oluşumları App::CallAPI(...) bir sorgu ile değiştirilir ya da "aynı şeyi" do sorguları ayarlamak gerekir.
  2. Herhangi bir oluşumları App::$FS->... örneğin move_uploaded_file şeklinde PHP doğru dosya yönetim fonksiyonları ile değiştirilmesi gerekir, readfile, vs ..

Here it is. Keep in mind that there are functions here which allow you to see files owned by a given user, delete files, and so on and so forth. More explanation at the bottom...

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

}

Notes:

Bu sınıf güvenliği uygulamak ETMEZ unutmayın. Bu arayan FileClient::Serve(...) vb çağırmadan önce doğrulanmış Owner_Field ve Owner_Key sahip olduğunu varsayar ..

Biraz geç oldu, bu yüzden bazı mantıklı değilse, sadece bir yorum bırakın. Harika bir akşam var, ve ben bu biraz yardımcı olur umarım.

PS. Kullanıcı arayüzü vb basit tablolar ve dosya yükleme alanları, olabilir. Yoksa süslü olması ve bir flash uploader kullanabilirsiniz ...

Ben aşağıdaki topluluk-katkıda CakePHP kod örneklere bir göz olması tavsiye:

Burada iyi bir seçimdir. Bu bir PC istemci ve tek bir dosya php sunucusu yüklemeniz gerekir. Ama hızlı çalışır!

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