Frage

Wir brauchen eine Datei-Management-Schnittstelle, die mit dem Kunden auf CakePHP gebaut aktuelle Website integriert erstellen.

Der Dateimanager muss nur die Benutzer lassen die Dateien sehen, die sie Berechtigungen zu haben.

Der Benutzer Dateien fähig sein (jeder Größe) zu laden und haben andere Benutzer die Dateien herunterladen (falls Berechtigungen zulassen).

Das ist kein Problem für viele Dateimanagementsysteme, die uns aber nicht kaufen können, dass ich integriere mit ihrem aktuellen Login-System zu finden. Der Kunde will nur die Benutzer einmal anmelden in ihrem Benutzer CP zugreifen und ihre Dateien. So soweit ich unsere einzige Option sehen kann, ist ein Datei-Management bauen ihnen eine Schnittstelle.

Was sind einige der Optionen, die wir Uploads erlauben müssen PHP? Ich verstehe, dass wir das PHP-Upload-Limit erhöhen müssen, aber gibt es eine Obergrenze, die / Apache PHP erlauben?

Die Dateien werden wahrscheinlich bei etwa 150MB Kappe heraus, ob das relevant ist, jedoch kann es Situationen geben, in denen die Dateigrößen größer sein werden.

Auch was ist die Do Gebote und Verbote von Datei-Upload / Kontrolle auf einem Linux-Server?

Ich glaube, ich habe keine wirklichen ‚spezifische‘ Fragen, aber würde einige beraten gerne auf, wo einige der typischen Fallen beginnen und wir werden laufen in.

War es hilfreich?

Lösung

Die Dateiverwaltung ist ganz einfach, eigentlich. Hier sind einige Vorschläge, die Sie in die richtige Richtung zeigen kann.

Vor allem wenn diese eine Last ausgeglichene Situation Web-Servers ist, müssen Sie die Komplexität ein wenig verstärken, um die Dateien in einem gemeinsamen Stelle zu setzen. Wenn das der Fall ist, ping mich, und ich bin glücklich, Ihnen zu schicken unsere super-light-Datei Server / Client wir für die gleiche Situation verwenden.

Es gibt ein paar Variablen wollen Sie, um beeinflussen, um größere Uploads zu ermöglichen. Ich empfehle Apache Direktiven um diese Änderungen zu einer bestimmten Datei zu begrenzen:

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

Architektur:

Erstellen Sie eine Datenbank-Tabelle, die einige Informationen über jede Datei gespeichert werden.

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 

Was ist Owner_Field und Owner_Key? Ein einfacher Weg, zu sagen, was „Einheit“, um die Datei besitzt. In diesem speziellen Fall gab es mehrere Arten von Dateien hochgeladen werden. In Ihrem Fall kann ein einfaches User_ID Feld ausreichend sein.

Der Zweck der Besitzer der Speicherung ist, so dass Sie beschränken kann, die herunterladen und die Datei löschen. Das wird zum Schutz der Downloads von entscheidender Bedeutung sein.

Hier ist eine Beispielklasse , die verwendet werden können, die das Hochladen von Dateien aus dem Browser zu akzeptieren. Sie werden es ändern müssen passen, natürlich.

Es gibt ein paar Dinge über den folgenden Code zu notieren. Da dies mit einem Application Server und Dateiserver verwendet wird, gibt es ein paar Dinge zu „ersetzen“.

  1. Jedes Vorkommen von App::CallAPI(...) muß mit einer Abfrage oder Abfrage ersetzt werden, die die „gleichen“ tun.
  2. Jedes Vorkommen von App::$FS->... muß mit der richtigen Datei Umgang mit Funktionen in PHP wie move_uploaded_file ersetzt werden, readfile, etc ...

Hier ist sie. Beachten Sie, dass es Funktionen, die hier sind, die es Ihnen ermöglichen, Dateien, die von einem bestimmten Benutzer gehören, um zu sehen, Dateien löschen, und so weiter und so fort. Weitere Erklärung am unteren ...

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

}

Weitere Informationen:

Bitte beachten Sie, dass diese Klasse nicht implementiert Sicherheit. Er geht davon aus, dass der Anrufer ein authentifizierter Owner_Field und Owner_Key vor dem Aufruf von FileClient::Serve(...) etc ...

Es ist ein bisschen spät, so dass, wenn einige dieser macht keinen Sinn, nur einen Kommentar hinterlassen. Machen Sie einen schönen Abend, und ich hoffe, dass dies einige hilft.

PS. Die Benutzeroberfläche kann einfache Tabellen und Datei-Upload-Felder sein, etc .. Sie können auch eine Flash-Uploader Phantasie und benutzen ...

Andere Tipps

Ich empfehle einen Blick auf den folgenden Community-Beiträge CakePHP Code-Beispiele mit:

hier ist eine gute Wahl. Es erfordert, dass Sie ein PC-Client und einen einzelnen Datei php-Server installieren. Aber es läuft schnell!

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top