我有一堆使用刮刀下载的PDF。这个刮刀没有检查文件是JPG还是PDF,所以默认情况下所有文件都被下载并保存在' .pdf'延期。因此,只是为了澄清批处理中的所有文件都是.pdf。但是,如果我尝试通过服务器或本地打开它们(非PDF而非JPG的文件),我会发现错误。
我的问题。有没有办法用PHP检查并查看此文件是否是有效的PDF?我想通过循环运行所有URL来检查这些文件。它们有数百个,需要花费数小时才能检查。
由于
答案 0 :(得分:2)
对于本地文件(PHP 5.3 +):
$finfo = finfo_open(FILEINFO_MIME_TYPE);
foreach (glob("path/to/files") as $filename) {
if(finfo_file($finfo, $filename) === 'application/pdf') {
echo "'{$filename}' is a PDF" . PHP_EOL;
} else {
echo "'{$filename}' is not a PDF" . PHP_EOL;
}
}
finfo_close($finfo);
对于远程文件:
$ch = curl_init();
$url = 'http://path.to/your.pdf';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$results = split("\n", trim(curl_exec($ch)));
foreach($results as $line) {
if (strtok($line, ':') == 'Content-Type') {
$parts = explode(":", $line);
echo trim($parts[1]); // output: application/pdf
}
}
答案 1 :(得分:1)
使用函数finfo_file()
获取文件的MIME类型if (function_exists('finfo_open')) {
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, "PATH-TO-YOUR-FILE");
finfo_close($finfo);
echo $mimetype;
}
echo "<pre>";
print_r($mimetype);
echo "</pre>";
答案 2 :(得分:1)
使用finfo_file()
功能
<?php
if (function_exists('finfo_open')) {
$mime = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($mime, "FILE-PATH");
if($mime_type == "application/pdf")
echo "file is pdf";
else
echo "file is not pdf";
finfo_close($mime);
}
答案 3 :(得分:0)
有时您必须检查文件的mime签名,有时还要检查变量的mime签名。这些是您进行两项检查的方式:
$filename = '/path/to/my/file.pdf';
$content = file_get_contents($filename);
$file_is_pdf = function(string $filename) : bool {
return mime_content_type($filename) === 'application/pdf';
};
$var_is_pdf = function(string $content) : bool {
$mime_type_found = (new \finfo(FILEINFO_MIME))->buffer($content);
return $mime_type_found === 'application/pdf; charset=binary';
};
// Checks if a file contains a pdf signature.
var_dump($file_is_pdf($filename));
// Checks if a variable contains a pdf signature.
var_dump($var_is_pdf($content));