修复无法检测到 MIME 类型的图像
Fix images for which the mime type can not be detected
我有很多 图像需要使用第三方PHP 工具处理。所有这些图像都是 GIF、JPEG 或 PNG。但是,由于不正确的 MIME 类型,我在某些图像上遇到了错误。结果是一些图像(主要是 JPG 文件)被检测为 "application/octet-stream".
每当我用任何查看器打开图像时,一切似乎都正常。使用 Photoshop 重新保存此类图像后,MIME 类型被正确检测为 "image/jpeg"。我只是不喜欢打开和重新保存数千张图片。
我已经构建了一个出现问题的文件名列表。有什么方法可以 'fix' 检测到正确的 mime 类型的图像吗?
我使用以下命令发现了不正确的 MIME 类型:
file --mime-type <filename>
以下是一些示例图片:
运行 identify -ping -verbose <filename>
不 return mime 类型只有 Format。所有带有或不带有正确 mime 的 JPG 图片的格式都是 Format: JPEG (Joint Photographic Experts Group JFIF format)
。
关于版本的更多信息:
$ file --version
file-5.14
magic file from /etc/magic:/usr/share/misc/magic
$ identify --version
Version: ImageMagick 6.7.7-10 2014-03-06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
所以,基本上你是说
file --mime-type <filename>
不起作用?如果是这样,请尝试让 ImageMagick 为您解决:
identify -ping -verbose someImage.jpg | awk '/Mime type:/{print $NF}'
或post一些麻烦的图像,以便其他人可以测试一下。
也许您可以使用 ImageMagick 重写文件,然后 file --mime-type
就可以了。尝试 运行 这个:
convert troubleFile.jpg rebuilt.jpg
看看 file --mime-type rebuilt.jpg
是否有效。
仅供遇到相同问题的任何人使用。根据 Mark Setchell 的回答,我创建了以下 shell 脚本:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
if [[ $# -lt 1 ]] || [[ $# -gt 2 ]];
then
echo "Usage [=10=] <directory> [<backupdir>]"
exit
fi
for FILENAME in $(find -regex ".*\.\(jpg\|gif\|png\|jpeg\)");
do
MIME=$(file --mime-type "$FILENAME" | awk '{print $NF}')
if [ "$MIME" == "application/octet-stream" ]
then
echo "$FILENAME has mime type $MIME:"
if [[ ! -z ]];
then
echo " - Creating backup"
cp "$FILENAME" ""
fi
echo " - Running convert"
convert "$FILENAME" "$FILENAME"
if [[ $? -eq 0 ]];
then
echo " - Done!"
else
echo " - Error!"
echo "$FILENAME" >> errors.txt
fi
fi
done
IFS=$SAVEIFS
它将递归搜索目录以查找 jpg/png/gif 文件并检查 mime 类型。如果 mime 类型是 "application/octet-stream"
,它将尝试转换图像而不实际对图像执行任何可见的更改。执行此操作后,将检测到正确的 MIME 类型。
无法转换的图像将被登录 errors.txt
。您还可以提供一个用于保存原始文件的备份目录。
我有很多 图像需要使用第三方PHP 工具处理。所有这些图像都是 GIF、JPEG 或 PNG。但是,由于不正确的 MIME 类型,我在某些图像上遇到了错误。结果是一些图像(主要是 JPG 文件)被检测为 "application/octet-stream".
每当我用任何查看器打开图像时,一切似乎都正常。使用 Photoshop 重新保存此类图像后,MIME 类型被正确检测为 "image/jpeg"。我只是不喜欢打开和重新保存数千张图片。
我已经构建了一个出现问题的文件名列表。有什么方法可以 'fix' 检测到正确的 mime 类型的图像吗?
我使用以下命令发现了不正确的 MIME 类型:
file --mime-type <filename>
以下是一些示例图片:
运行 identify -ping -verbose <filename>
不 return mime 类型只有 Format。所有带有或不带有正确 mime 的 JPG 图片的格式都是 Format: JPEG (Joint Photographic Experts Group JFIF format)
。
关于版本的更多信息:
$ file --version
file-5.14
magic file from /etc/magic:/usr/share/misc/magic
$ identify --version
Version: ImageMagick 6.7.7-10 2014-03-06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
所以,基本上你是说
file --mime-type <filename>
不起作用?如果是这样,请尝试让 ImageMagick 为您解决:
identify -ping -verbose someImage.jpg | awk '/Mime type:/{print $NF}'
或post一些麻烦的图像,以便其他人可以测试一下。
也许您可以使用 ImageMagick 重写文件,然后 file --mime-type
就可以了。尝试 运行 这个:
convert troubleFile.jpg rebuilt.jpg
看看 file --mime-type rebuilt.jpg
是否有效。
仅供遇到相同问题的任何人使用。根据 Mark Setchell 的回答,我创建了以下 shell 脚本:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
if [[ $# -lt 1 ]] || [[ $# -gt 2 ]];
then
echo "Usage [=10=] <directory> [<backupdir>]"
exit
fi
for FILENAME in $(find -regex ".*\.\(jpg\|gif\|png\|jpeg\)");
do
MIME=$(file --mime-type "$FILENAME" | awk '{print $NF}')
if [ "$MIME" == "application/octet-stream" ]
then
echo "$FILENAME has mime type $MIME:"
if [[ ! -z ]];
then
echo " - Creating backup"
cp "$FILENAME" ""
fi
echo " - Running convert"
convert "$FILENAME" "$FILENAME"
if [[ $? -eq 0 ]];
then
echo " - Done!"
else
echo " - Error!"
echo "$FILENAME" >> errors.txt
fi
fi
done
IFS=$SAVEIFS
它将递归搜索目录以查找 jpg/png/gif 文件并检查 mime 类型。如果 mime 类型是 "application/octet-stream"
,它将尝试转换图像而不实际对图像执行任何可见的更改。执行此操作后,将检测到正确的 MIME 类型。
无法转换的图像将被登录 errors.txt
。您还可以提供一个用于保存原始文件的备份目录。