سؤال

نحن بحاجة إلى إنشاء ملف واجهة إدارة يدمج مع عملاء الموقع الحالي بناء على للكيك.

مدير الملفات يجب السماح فقط للمستخدمين رؤية الملفات التي لديهم أذونات أيضا.

المستخدم سوف تكون قادرة على تحميل الملفات(من أي حجم) وغيرها من المستخدمين من تحميل تلك الملفات (إذا الأذونات السماح).

هذه ليست مشكلة بالنسبة للعديد من الملف نظم إدارة نتمكن من الشراء ولكن لا يمكنني العثور سوف تدمج مع السجل الحالي في النظام.العميل يريد فقط للمستخدمين تسجيل الدخول مرة واحدة للوصول إلى المستخدم م أ و الملفات الخاصة بهم.بقدر ما أستطيع أن أرى خيارنا الوحيد هو بناء ملف واجهة إدارة أنفسنا.

ما هي بعض من الخيارات التي يجب أن تسمح بتحميل باستخدام PHP?أنا أفهم أننا بحاجة إلى زيادة php تحميل الحد ، ولكن هل هناك سقف php/apache سوف تسمح ؟

الملفات من المرجح أن الأقصى في حوالي 150MB إذا كان هذا هو ذات الصلة ، ومع ذلك قد تكون هناك حالات حيث أحجام الملفات سوف تكون أكبر.

أيضا ما هي الأوامر والنواهي من تحميل الملف/السيطرة على خادم لينكس?

أعتقد أني لا أملك الحقيقي 'الخاصة' الأسئلة ولكن أود بعض المشورة بشأن من أين تبدأ و بعض مطبات نموذجية سوف تصل إلى.

هل كانت مفيدة؟

المحلول

إدارة الملفات من السهل جدا في الواقع.وإليك بعض الاقتراحات التي يمكن أن نشير لكم في الاتجاه الصحيح.

أولا وقبل كل شيء, إذا كان هذا هو الحمل متوازنة ملقم ويب الحالة, سوف تحتاج إلى خطوة حتى تعقد قليلا من أجل وضع الملفات في مكان مشترك.إذا كان هذا هو الحال ، بينغ لي وأنا سوف نكون سعداء لنرسل لك لدينا فائقة ضوء ملف الخادم/العميل نستخدمها في نفس الوضع.

هناك عدد قليل من المتغيرات سوف تريد أن تؤثر على لإتاحة أكبر الإضافات.أوصي باستخدام أباتشي توجيهات للحد من هذه التغييرات إلى ملف معين:

<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 المجال قد تكون كافية.

الغرض من تخزين المالك بحيث يمكنك تقييد الذين يمكن تحميل و حذف الملف.التي ستكون حاسمة لحماية شعبية.

هنا عينة من الدرجة التي يمكن استخدامها لقبول تحميل الملف من المتصفح.سوف تحتاج إلى تعديلها لتناسب بالطبع.

وهناك عدد قليل من الأشياء أن نلاحظ حول التعليمة البرمجية التالية.لأن هذا هو استخدامها مع تطبيق Server و ملقم الملفات ، هناك عدد قليل من الأشياء أن "استبدال".

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

}

ملاحظات:

يرجى أن نضع في اعتبارنا أن هذه الفئة لا تنفذ الأمن.فإنه يفترض أن المتصل قد مصادق عليه Owner_Field و Owner_Key قبل الاتصال FileClient::Serve(...) الخ...

انها قليلا في وقت متأخر ، حتى لو كان بعض هذا لا معنى له, مجرد ترك تعليق.صباح مساء ، وأنا آمل أن يساعدك هذا.

PS.واجهة المستخدم يمكن أن تكون بسيطة الجداول تحميل الملف المجالات ، الخ..أو هل يمكن أن يكون الهوى استخدام فلاش رافع...

نصائح أخرى

أوصي وجود نظرة على ما يلي ساهم المجتمع للكيك أمثلة التعليمات البرمجية:

وهنا هو خيار جيد. فهو يتطلب تثبيت عميل PC وملقم ملفات فب احد. لكن تشغيله بسرعة!

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top