PHP bir dosyanın içerik türünü almak nasıl?

5 Cevap php

Ben eki olan bir e-posta göndermek için PHP kullanıyorum. Eki birkaç farklı dosya türleri (pdf, txt, doc, swf, vb) herhangi biri olabilir.

Birincisi, script "file_get_contents" kullanarak dosyayı alır.

Daha sonra, komut başlığında yankıları:

Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>"

Nasıl için doğru değeri ayarlamak için $the_content_type?

5 Cevap

PHP ya da sadece kötü sonuçlar eski sürümleri için telafi etmek için çeşitli fallbacks içerir, bu işlevi kullanıyorum:

function getFileMimeType($file) {
    if (function_exists('finfo_file')) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $type = finfo_file($finfo, $file);
        finfo_close($finfo);
    } else {
        require_once 'upgradephp/ext/mime.php';
        $type = mime_content_type($file);
    }

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) {
        $secondOpinion = exec('file -b --mime-type ' . escapeshellarg($file), $foo, $returnCode);
        if ($returnCode === 0 && $secondOpinion) {
            $type = $secondOpinion;
        }
    }

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) {
        require_once 'upgradephp/ext/mime.php';
        $exifImageType = exif_imagetype($file);
        if ($exifImageType !== false) {
            $type = image_type_to_mime_type($exifImageType);
        }
    }

    return $type;
}

Bu yeni PHP finfo işlevleri kullanmaya çalışır. Bu mevcut değilse, o mime_content_type alternatif kullanır ve emin bu var olmak Upgrade.php kütüphanesinden drop-in değiştirilmesi içerir. Bu yararlı bir şey dönmedi, bu OS 'file komutu deneyeceğim. AFAIK bu * NIX sistemler sadece mevcut bulunuyor, bunu değiştirmek ya da Windows üzerinde bu kullanmayı planlıyorsanız, ondan kurtulmak isteyebilirsiniz. Hiçbir şey çalıştı, yalnızca görüntüler için çare exif_imagetype olarak çalışır.

Ben farklı sunucular mime türü işlevleri için onların desteği çok farklı olduğunu fark gelmek ve upgrade.php mime_content_type yedek mükemmel olmaktan uzak olduğunu var. Sınırlı exif_imagetype fonksiyonları, özgün ve upgrade.php değiştirme hem olsa da, oldukça güvenilir çalışıyor. Sadece görüntüler hakkında endişeleriniz varsa, sadece bu son birini kullanmak isteyebilirsiniz.

İşte PHP5 ve PECL'de mevcuttur finfo_open hangi kullanarak bir örnek:

$mimepath='/usr/share/magic'; // may differ depending on your machine
// try /usr/share/file/magic if it doesn't work
$mime = finfo_open(FILEINFO_MIME,$mimepath);
if ($mime===FALSE) {
 throw new Exception('Unable to open finfo');
}
$filetype = finfo_file($mime,$tmpFileName);
finfo_close($mime);
if ($filetype===FALSE) {
 throw new Exception('Unable to recognise filetype');
}

Alternatif olarak, deprecated mime_ content_ type işlevini kullanabilirsiniz:

$filetype=mime_content_type($tmpFileName);

veya yerleşik işlevleri OS kullanımı:

ob_start();
system('/usr/bin/file -i -b ' . realpath($tmpFileName));
$type = ob_get_clean();
$parts = explode(';', $type);
$filetype=trim($parts[0]);

Gerçekten e-postalar seinding için "CodeIgniter" gibi bir Framework kullanmanızı öneririz. Burada sadece 18 Dakika "CodeIgniter ile e-postalar göndermek" hakkında bir Screencast olduğunu.

http://net.tutsplus.com/videos/screencasts/codeigniter-from-scratch-day-3/

Fonksiyon başlık var:

 header('Content-Type: '.$the_content_type);

Bu fonksiyon before herhangi bir çıkış çağrılacak olduğunu unutmayın. Siz referans ayrıntılı bilgi bulabilirsiniz http://php.net/header

Edit:

Ops, I've misunderstood the question: Since php 4.0 there is the function mime_content_type to detect the mimetype of a file.

Php 5 önerilmemektedir olarak, fonksiyonların file info kümesi tarafından değiştirilmesi gerekir.