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.
- Herhangi oluşumları
App::CallAPI(...)
bir sorgu ile değiştirilir ya da "aynı şeyi" do sorguları ayarlamak gerekir.
- 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 ...