2

我正在将图像从我的 Android 应用程序上传到我的服务器。该应用程序使用 android 相机意图并通过 PHP 脚本上传是可以的。

我想验证上传的文件是否是真实图像,我不是检查扩展名而是检查 mimetype(我想这是最好的方法,如果我错了,请告诉我)。

我正在使用 Slackware Linux Apache 服务器,并且正在尝试以下代码:

....
$finfo = finfo_open(FILEINFO_MIME, '/etc/httpd/magic');
....
fwrite($fp, finfo_file($finfo, "file.jpg"));
....

但我得到的是“application/octet-stream; charset=binary”而不是“file -i file.jpg”(shell 命令)给出的“image/jpeg;charset=binary”。

有什么问题?

4

4 回答 4

2

使用 $finfo = finfo_open(FILEINFO_MIME); 解决 而不是另一条线。我认为默认的魔术文件与我指定的不同。

于 2013-11-11T13:52:26.793 回答
0

www.php.net/manual/en/ref.fileinfo.php 所述

<?php

function is_jpg($fullpathtoimage){
    if(file_exists($fullpathtoimage)){
        exec("/usr/bin/identify -format %m $fullpathtoimage",$out);
        //using system() echos STDOUT automatically
        if(!empty($out)){
            //identify returns an empty result to php
            //if the file is not an image

            if($out == 'JPEG'){
                return true;
            }
        }
    }
    return false;
}

?>
于 2013-11-11T13:41:25.320 回答
0

或者,如果您有执行权并且想要使用“hacky”解决方案,您可以简单地执行您已经完成的操作(使用file -i pathwith shell_exec):

<?php
    function shell_get_mime_type($path) {
        if (is_readable($path)) {
            $command = 'file -i "' . realpath($path) . '"';

            $shellOutput = trim(shell_exec($command));
            //eg. "nav_item.png: image/png; charset=binary"

            if (!empty($shellOutput)) {
                $colonPosition = strpos($shellOutput, ':');

                if ($colonPosition !== false) {
                    return rtrim(substr($shellOutput, $colonPosition + 1));
                }

                return $shellOutput;
            }
        }

        return false;
    }
?>
于 2013-11-11T13:49:45.270 回答
-2

尝试使用功能mime_content_type()

于 2013-11-11T13:33:14.670 回答