Ich benutze PHP, um eine E-Mail mit einem Anhang zu senden. Der Anhang kann aus verschiedenen Dateitypen bestehen (pdf, txt, doc, swf usw.).
Zuerst ruft das Skript die Datei mit "file_get_contents" ab.
Später gibt das Skript Folgendes in der Kopfzeile wieder:
Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>"
Wie setze ich den korrekten Wert für $ the_content_type ?
Ich verwende diese Funktion, die mehrere Fallbacks enthält, um ältere Versionen von PHP oder einfach schlechte Ergebnisse auszugleichen:
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;
}
Es wird versucht, die neueren PHP finfo
-Funktionen zu verwenden. Wenn diese nicht verfügbar sind, verwendet sie die mime_content_type
-Alternative und enthält die Drop-In-Ersetzung aus der Bibliothek Upgrade.php , um sicherzustellen, dass dies vorhanden ist. Wenn diese nichts nützliches zurückgegeben haben, wird der Befehl file
des Betriebssystems verwendet. AFAIK ist nur auf * NIX-Systemen verfügbar. Möglicherweise möchten Sie dies ändern oder entfernen, wenn Sie beabsichtigen, dies unter Windows zu verwenden. Wenn nichts funktioniert hat, wird exif_imagetype
als Fallback nur für Bilder versucht.
Ich habe festgestellt, dass die verschiedenen Server in ihrer Unterstützung für die MIME-Funktionen sehr unterschiedlich sind und der Upgrade.php mime_content_type
-Ersatz bei weitem nicht perfekt ist. Die begrenzten exif_imagetype
-Funktionen, sowohl das Original als auch der Upgrade.php-Ersatz, funktionieren jedoch ziemlich zuverlässig. Wenn Sie sich nur um Bilder kümmern, möchten Sie möglicherweise nur das letzte Bild verwenden.
Mit finfo_file: http://de2.php.net/manual/de/function.finfo-file.php
Es ist sehr leicht, es in PHP zu haben.
Rufen Sie einfach die folgende PHP-Funktion auf mime_content_type
<?php
$filelink= 'uploads/some_file.pdf';
$the_content_type = "";
// check if the file exist before
if(is_file($file_link)) {
$the_content_type = mime_content_type($file_link);
}
// You can now use it here.
?>
PHP Dokumentation der Funktion mime_content_type () Hoffe es hilft jemandem
Hier ist ein Beispiel mit finfo_open , das in PHP5 und PECL verfügbar ist:
$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');
}
Alternativ können Sie die Funktion deprecated mime_ content_ type verwenden:
$filetype=mime_content_type($tmpFileName);
oder verwenden Sie die Betriebssysteme in eingebauten Funktionen:
ob_start();
system('/usr/bin/file -i -b ' . realpath($tmpFileName));
$type = ob_get_clean();
$parts = explode(';', $type);
$filetype=trim($parts[0]);
function getMimeType( $filename ) {
$realpath = realpath( $filename );
if ( $realpath
&& function_exists( 'finfo_file' )
&& function_exists( 'finfo_open' )
&& defined( 'FILEINFO_MIME_TYPE' )
) {
// Use the Fileinfo PECL extension (PHP 5.3+)
return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath );
}
if ( function_exists( 'mime_content_type' ) ) {
// Deprecated in PHP 5.3
return mime_content_type( $realpath );
}
return false;
}
Das hat für mich funktioniert
Ich glaube, ich habe einen kurzen Weg gefunden. Ermitteln Sie die Bildgröße mit:
$infFil=getimagesize($the_file_name);
und
Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>"
Die Variable getimagesize
gibt ein assoziatives Array mit einem MIME-Schlüssel zurück
Ich habe es benutzt und es funktioniert
Ich habe die meisten Vorschläge ausprobiert, aber alle scheitern bei mir (ich bin anscheinend zwischen jeder nützlichen Version von PHP). Ich hatte die folgende Funktion:
function getShellFileMimetype($file) {
$type = Shell_exec('file -i -b '. escapeshellcmd( realpath($_SERVER['DOCUMENT_ROOT'].$file)) );
if( strpos($type, ";")!==false ){
$type = current(explode(";", $type));
}
return $type;
}