私はPHP=を使用して、添付ファイル付きの電子メールを送信しています。添付ファイルは、いくつかの異なるファイルタイプ(pdf、txt、doc、swfなど)のいずれかである可能性があります。
まず、スクリプトは「file_get_contents」を使用してファイルを取得します。
その後、スクリプトはヘッダーにエコーします。
Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>"
$ the_content_typeに正しい値を設定するにはどうすればよいですか?
私はこの関数を使用しています。これには、古いバージョンのPHPまたは単に悪い結果を補うためのいくつかのフォールバックが含まれています。
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;
}
新しいPHP finfo
関数を使用しようとします。それらが利用できない場合は、mime_content_type
代替、これが存在することを確認するために pgrade.php ライブラリからのドロップイン置換が含まれています。それらが有用なものを返さなかった場合は、OSのfile
コマンドを試します。 * NIXシステムでのみ利用可能なAFAIKです。Windowsでこれを使用する予定がある場合は、変更するか、削除することをお勧めします。何もうまくいかなかった場合、exif_imagetype
画像のフォールバックとしてのみ。
サーバーごとにMIMEタイプ関数のサポートが大きく異なり、Upgrade.php mime_content_type
交換は完全にはほど遠いです。限定exif_imagetype
関数は、元の関数とUpgrade.phpの置き換えの両方ですが、かなり確実に機能しています。画像だけに関心がある場合は、この最後の画像のみを使用することをお勧めします。
Phpでそれを持っていることは非常に簡単です。
次のphp関数を呼び出すだけです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.
?>
関数mime_content_type()のPHPドキュメント 誰かに役立つことを願っています
Finfo_fileの場合: http://us2.php.net/manual/en/function.finfo-file.php
以下は、PHP5とPECLで利用可能な finfo_open を使用した例です。
$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');
}
または、deprecatedmime_ content_ type 関数を使用できます。
$filetype=mime_content_type($tmpFileName);
または、OSの組み込み関数を使用します。
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;
}
これは私のために働いた
私は短い道を見つけたと思います。以下を使用して画像サイズを取得します。
$infFil=getimagesize($the_file_name);
そして
Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>"
getimagesize
は、MIMEキーを持つ連想配列を返します
私はそれを使用し、それは動作します
私はほとんどの提案を試しましたが、それらはすべて私にとって失敗します(PHPの便利なバージョンの中間にいます。私は次の関数で終わりました:
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;
}