Итак, кто-то напутал и сломал функцию загрузки изображений. Расширение .
был исключен … Это означает, что все изображения были сохранены как imagejpg
вместо image.jpeg
,
Я догадался; Нет проблем, я просто переберу папки и переименую файлы, верно? очень просто;
public function renameImgs(){
$dirs = array_filter(glob(DOCROOT.'/uploads/products/*'), 'is_dir');
foreach($dirs as $dir){
$files = glob($dir.'/*');
foreach($files as $file){
$filename = strtolower($file);
$newFileName = str_replace('jpg', '.jpg', $filename);
if(!copy($filename, $newFileName)){
echo "failed to copy file: $filename";
}
else{
unlink($filename);
}
//if(imagecreatefromjpeg($filename)){
//echo "Can still create image from $filename";
//}
}
}
echo "done";
}
Я также попробовал rename()
функция вместо copy()
, но это, видимо, на самом деле не имеет значения.
Тем не мение.
Когда я делаю это, все изображения испорчены. Если я попытаюсь открыть их на своем ПК после загрузки, изображение будет мигать, прежде чем сообщить мне, что оно повреждено. Некоторые из них прошли через это, хотя все они имеют визуальное искажение.
Когда я беру файлы с резервными копиями (к счастью, я их сделал) и переименовываю их вручную на моем ПК (windows), изображения в порядке. Тем не менее, мы говорим о 1800 изображениях здесь. Мне действительно не хочется делать это вручную, когда я смогу просто исправить это с помощью скрипта.
Я чувствую, что могу просто переименовать файл без это так или иначе подтверждается, это должно работать?
imagecreatefromjpeg
функция не прошла ни разу, к вашему сведению.
TL; DR
Я хочу исправить расширения изображений, не нарушая их
ДО
Я проверил на Windows (XAMPP) и, кажется, мне хорошо
<?php
function renameImgs() {
$mime = array(
// images
'image/png' => 'png',
'image/jpeg' => 'jpg',
'image/gif'=> 'gif',
'image/bmp' => 'bmp',
);
$basedir = 'upload';
foreach (GLOB($basedir .'/*', GLOB_ONLYDIR) as $dir) {
foreach(GLOB($dir . '/*', GLOB_BRACE) as $img) {
$path = pathinfo($img)['dirname'];
// mime_content_type is more reliable
$ext = $mime[mime_content_type($img)];
$file = strtolower(basename($img));
$newname = $path .'/' . preg_replace('/(jpg)|(jpeg)|(gif)|(bmp)/i', '.' . $ext, $file);
echo $newname;
if(copy($img, $newname)) {
unlink($img);
};
}
}
}
renameImgs();
?>
Других решений пока нет …