2014-04-03 64 views
0

我使用imap_fetcheader獲取郵件的附件,只是內容。下面的代碼 -imap_fetchheader字節與實際文件大小

if (isset($content->ifdparameters) && $content->ifdparameters == 1 && isset($content->dparameters) && is_array($content->dparameters)) { 
      foreach ($content->dparameters as $object) { 
       if (isset($object->attribute) && preg_match('~filename~i', $object->attribute)) {      
        $attachment = new EmailAttachment(); 

        $attachment->attachment_name = $object->value;                
        $attachment->attachment_size = $this->format_bytes($content->bytes); 
        $attachment->attachment_part_id = empty($actualpart) ? 1 : $actualpart; 
        $attachment->attachment_encoding = $content->encoding; 
        $results[] = $attachment; 
       } 
      } 
     } 

format_bytes功能是在這裏 -

private function format_bytes($bytes, $precision = 2) { 
    $units = array('B', 'KB', 'MB', 'GB', 'TB'); 

    $bytes = max($bytes, 0); 
    $pow = floor(($bytes ? log($bytes) : 0)/log(1024)); 
    $pow = min($pow, count($units) - 1); 

    $bytes /= pow(1024, $pow); 

    return round($bytes, $precision) . ' ' . $units[$pow]; 
} 

當用戶點擊附件,我抓住從郵件服務器的附件內容和回聲回覆內容。

的問題是 -

$content->bytes屬性報告的字節數基本上是不同的,那麼什麼會下載到客戶端計算機...

這是一個已知的問題?

郵件服務器是託管在CentOS操作系統上的POSTFIX。

回答

2

它往往大約33%,因爲這是多少額外的批量base64編碼增加。

雖然這並不總是33%:還有其他的編碼,base64是附件中最常用的編碼。

+0

因此,當我沒有真正下載附件時向用戶展示尺寸時,我可以將其減少33%並將其顯示給用戶,否則這會太糟糕了嗎? –

+0

大部分時間都合理,但這個大小實際上反映了數據的使用情況。在某些情況下,它可能會被引用 - 可打印編碼,或者可能根本沒有編碼(純粹的ascii.txt文檔)。在調整之前,您需要找出編碼。如果它是base64,那是一個合理的假設。 – Max

+1

另外,這是PHP數學;)你需要減少25%,而不是33%。增加33%到3,你有4。現在減少25%,你又有3。 – arnt