php 上传Исправлениесломанныхназванийкириллическихфайлов-картиноквпапке
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 上传Исправлениесломанныхназванийкириллическихфайлов-картиноквпапке相关的知识,希望对你有一定的参考价值。
<?php
/**
* ЧАСТЬ 1: ремонтирует поломанные названия кириллических файлов в папке uploads.
* Когда файл выглядит так: Дом_РёР·_клеёного_Р±СЂСѓСЃР° - это 'cp-1251'
*/
if( isset($_GET['repair_files']) ){
// настройки
$maindir = wp_upload_dir();
$debug = 1;
// проверка - $debug
// Прежде чем запускать, закиньте один файл в папку uploads и запустите эту проверку, этот файл должен переименоваться.
// Если все работает, то выключаем debug, удаляем проверочный файл и запускаем полное переименование - это может занять время. Для работы с большим объемом файлов скрипт не рассчитан...
if( $debug ){
foreach( glob( $maindir['basedir'] ."/*") as $fname ){
if( is_file($fname) ){
echo var_dump( __repair_cyrilic_filenames_rename( $fname ) );
echo ' - '. dirname($fname) .' - '. basename( $fname ) ."<br>\n";
}
}
die('КОНЕЦ');
}
// запускаем полное переименование в папке uploads
if( ! $debug ){
repair_cyrilic_filenames( $maindir['basedir'] );
die('КОНЕЦ');
}
}
// функции
function repair_cyrilic_filenames( $dir ){
if( is_dir($dir) ){
foreach( glob("$dir/*") as $fname ){
call_user_func( __FUNCTION__, $fname ); // рекурсия
}
}
//repair
elseif( is_file($dir) ){
echo __repair_cyrilic_filenames_rename( $dir ) ? 'ОК - ' : 'ERROR - ';
echo $dir ."<br>\n";
}
}
function __repair_cyrilic_filenames_rename( $fname ){
$new_fname = mb_convert_encoding( $fname, 'cp-1251', 'utf-8');
return @ rename( $fname, $new_fname );
}
/**
* ЧАСТЬ 2: транслитерация названий файлов в каталоге
*/
if( isset($_GET['sanitize_file_name_in_dir']) ){
// запуск
$maindir = wp_upload_dir();
sanitize_file_name_in_dir( $maindir['basedir'] );
die('КОНЕЦ');
}
function sanitize_file_name_in_dir( $dir ){
if( is_dir($dir) ){
foreach( glob("$dir/*") as $fname ){
call_user_func( __FUNCTION__, $fname ); // рекурсия
}
}
//repair
elseif( is_file($dir) ){
if( preg_match( '~[^/]+$~', $dir, $m ) ){
$_fname = $m[0];
$_dir = str_replace( $_fname, '', $dir );
$_fname = mb_convert_encoding( $_fname, 'utf-8', 'cp-1251');
$_fname = sanitize_file_name( $_fname );
if($_fname){
$new_fname = $_dir . $_fname;
if( ($dir != $new_fname) && @ rename( $dir, $new_fname ) )
echo 'OK - '. $dir .' >>> '. $new_fname ."<br>\n";
else
echo 'ERROR - '. $dir .' >>> '. $new_fname ."<br>\n";
}
}
}
}
/**
* ЧАСТЬ 3: транслитерация названий файлов в базе данных
*/
if( isset($_GET['sanitize_filename_in_db']) ){
sanitize_filename_in_db();
die('КОНЕЦ');
}
function sanitize_filename_in_db(){
global $wpdb;
$ress = $wpdb->get_results("SELECT ID, guid FROM $wpdb->posts WHERE post_type = 'attachment' AND guid LIKE '%uploads%'");
if( $ress ){
foreach( $ress as $item ){
if( ! preg_match( '~[^/]+$~', $item->guid, $m ) )
continue;
$_fname = $m[0];
$_pre = str_replace( $_fname, '', $item->guid );
$_fname = sanitize_file_name( $_fname );
$new_guid = $_pre . $_fname;
if( $item->guid != $new_guid ){
$done = $wpdb->query(
$wpdb->prepare("UPDATE $wpdb->posts SET guid = %s WHERE ID = %d", $new_guid, $item->ID )
);
echo ($done ? "OK - $item->guid >>> $new_guid" : "ERROR - $item->guid") ."<br>\n";
}
}
}
// поправим данные в метаданных
//_wp_attached_file
$ress = $wpdb->get_results("SELECT * FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file'");
if( $ress ){
foreach( $ress as $item ){
if( ! preg_match( '~[^/]+$~', $item->meta_value, $m ) )
continue;
$_fname = $m[0];
$_pre = str_replace( $_fname, '', $item->meta_value );
$_fname = sanitize_file_name( $_fname );
$new_guid = $_pre . $_fname;
if( $item->meta_value != $new_guid ){
$done = $wpdb->query(
$wpdb->prepare("UPDATE $wpdb->postmeta SET meta_value = %s WHERE meta_id = %d", $new_guid, $item->meta_id )
);
echo ($done ? "OK - $item->meta_value >>> $new_guid" : "ERROR - $item->meta_value") ."<br>\n";
}
}
}
// поправим данные в метаданных
// _wp_attachment_metadata
// для этого лучше использовать плагин Forse Regenerate Thumbnails
}
/**
* ЧАСТЬ 4: транслитерация URL картинок из папки /uploads/ в контенте записи
*/
if( isset($_GET['sanitize_filename_in_post_content']) ){
sanitize_filename_in_post_content();
die('КОНЕЦ');
}
function sanitize_filename_in_post_content(){
global $wpdb;
$ress = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'publish' AND post_content LIKE '%/uploads/%'");
$out = '';
foreach( $ress as $post ){
$_out = array();
$_out[] = $post->post_title . ' - '. get_permalink($post->ID) ."\n\n";
preg_match_all('~/uploads/[^"\']+~', $post->post_content, $mm );
foreach( $mm as $arr ){
$echo_out = false;
foreach( $arr as $url ){
preg_match( '~[^/]+$~', $url, $m );
$_fname = $m[0];
$_pre = str_replace( $_fname, '', $url );
$_fname = sanitize_file_name( $_fname );
$new_url = $_pre . $_fname;
// заменяем
if( $url != $new_url ){
$wpdb->query("UPDATE $wpdb->posts SET post_content = REPLACE(post_content, '$url', '$new_url') WHERE ID = $post->ID");
$echo_out = true;
$_out[] = $new_url ."\n";
}
}
}
echo $echo_out ? implode('',$_out)."\n\n" : '';
}
}
/**
* ЧАСТЬ 5 (если надо): исправление размеров после регенерации миниатюр (forse-regenerate).
* Некоторые файлы, например, имели размер 300-200 а стали 300-201
*/
if( isset($_GET['fix_sizes_after_force_regenerate']) ){
fix_sizes_after_force_regenerate();
die('КОНЕЦ');
}
function fix_sizes_after_force_regenerate(){
global $wpdb;
$upload_dir_path = wp_upload_dir()['basedir'];
$ress = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'publish' AND post_content LIKE '%/uploads/%'");
$out = '';
$i=1;
foreach( $ress as $post ){
$_out = array();
$_out[] = $post->post_title . ' - '. get_permalink($post->ID) ."\n\n";
preg_match_all('~/uploads/[^"\']+~', $post->post_content, $mm );
foreach( $mm as $arr ){
$echo_out = false;
foreach( $arr as $url ){
$fpath = $upload_dir_path . str_replace('/uploads','',$url);
if( ! file_exists($fpath) ){
//$echo_out = true;
//$_out[] = $i++ .' - '. $fpath ."\n";
// получим все имеющиеся размеры файла
$fpath_patt = preg_replace('~-[0-9]+x[0-9]+(?=\.jpg|\.jpeg|\.png|\.gif)~', '*', $fpath );
//echo $fpath_patt;
//print_r( glob( $fpath_patt ) );
// удалим неподходящие размеры и получим нужный, он там один
$new_fpath = '';
foreach( glob( $fpath_patt ) as $pth ){
if( preg_match('~80x80~',$pth) ) continue;
if( ! preg_match('~-[0-9]+x[0-9]+\.(jpg|jpeg|png|gif)~',$pth) ) continue;
$new_fpath = $pth;
// удалим лишнюю начальную часть и заменяем все в контенте
$old_url = preg_replace('~^.*?/uploads/~','/uploads/', $fpath);
$new_url = preg_replace('~^.*?/uploads/~','/uploads/', $new_fpath);
$echo_out = $wpdb->query("UPDATE $wpdb->posts SET post_content = REPLACE(post_content, '$old_url', '$new_url') WHERE ID = $post->ID");
//$echo_out = true;
$_out[] = $old_url . ' - '. $new_url ."\n";
}
}
}
}
echo $echo_out ? implode('',$_out)."\n\n" : '';
}
}
以上是关于php 上传Исправлениесломанныхназванийкириллическихфайлов-картиноквпапке的主要内容,如果未能解决你的问题,请参考以下文章
sql Задание1.ДолжновыполнятьсясиспользованиемMySQL(иприжеланиисPHP)Преобразоватьданныетаблицытакимоб
php Еслинамнужно,чтобыбылоневозможноредактироватьполе“Название”,мывносимследующеевычисление...
php 帖子Поискпонесколькимкастомфлдамвыгребаетпостыопределенноготипаитаксономиисопределеннымикастомфилд
php Вывестиминимальнуюценуторговыхпредложенийвсписоктоваров
html 搜索引擎优化标题。 ДелаемТВ-параметр[[* seoTitle]]。 Еслидлястраницыонзаполнен,тогдавыводимего,аеслинет,т
php ОставляетуказанныегруппыполейACFнастраницеуказанныхтерминоввадминке,анаостальныхудаляет。