Копирование картинок без предварительного создания папки, как?

Статус
В этой теме нельзя размещать новые ответы.

NOIP

Гуру форума
Регистрация
17 Фев 2008
Сообщения
327
Реакции
77
Доброго времени суток, список всех картинок вытащил
Код:
$result = array();
preg_match_all('/<img[^>]*?src=\"(.*)\"/iU', $row->introtext, $result);
if (isset($result[1][0])) {$item->img = $result[1][0];}
Записал в БД.
Путь картинки такой /upload/images/2017/05/08/283/hi-res-786_22.jpg
или /upload/images/2017/05/07/443/hi-res-5211_12.jpg и тд.
Хочу скопировать список файлов которые есть в списке в новую директорию в папку upload2 но столкнулся с такой проблемой что нужно нужно создавать папку куда будет копироваться сама картинка, может кто нибудь сталкивался с подобным? как можно скопировать что бы папка создавалась по мере копирования? или все токи нужно получать список папок, создавать их и только после копировать?
 
Такое написал, должно работать

PHP:
$local_path = '/upload2';

$files = array(
    '/upload/images/2017/05/08/283/hi-res-786_22.jpg'
    '/upload/images/2016/11/01/283/hi-res-128_41.jpg'
    );
   
foreach( $files as $file)
{
    $dir = substr( $str, 0, strrpos($str, '/')+1 );
   
    array_map(function($item){
        if( in_array($item, array('', 'upload'))) continue;
       
        $local_path .= "/$item";
       
        if( !file_exists($local_path))
        {
            mkdir($local_path);
        }
    }, explode( '/', $dir ));
   
    copy($file, $local_path);
}
 
Такое написал, должно работать

PHP:
$local_path = '/upload2';

$files = array(
    '/upload/images/2017/05/08/283/hi-res-786_22.jpg'
    '/upload/images/2016/11/01/283/hi-res-128_41.jpg'
    );
  
foreach( $files as $file)
{
    $dir = substr( $str, 0, strrpos($str, '/')+1 );
  
    array_map(function($item){
        if( in_array($item, array('', 'upload'))) continue;
      
        $local_path .= "/$item";
      
        if( !file_exists($local_path))
        {
            mkdir($local_path);
        }
    }, explode( '/', $dir ));
  
    copy($file, $local_path);
}

Выдает ошибку Fatal error: Cannot break/continue 1 level in, ругается на строчку if( in_array($item, array('', 'upload'))) continue;.
 
return вместо continue сделай
Работает, теперь он жалуется Warning: copy(/upload2:( failed to open stream: Permission denied in хотя права 777 выставил.

Если я в $local_path ставлю полный путь то создается в корне файл upload2.

Распечатал
Код:
    array_map(function($item){
   var_dump($item);
Возвращает string(0) "" string(0) ""

Может я что то в корне делаю не так?
 
Последнее редактирование:
Переменная $local_path объявлена в глобальной области видимости и без конструкции use (&$local_path) к ней нет доступа внутри анонимной функции.
Третий параметр функции mkdir разрешает создание вложенных директорий, так что код можно сократить.
PHP:
$files = array(
  '/upload/images/2017/05/08/283/hi-res-786_22.jpg'
  '/upload/images/2016/11/01/283/hi-res-128_41.jpg'
  );
  
foreach( $files as $file)
{
  $local_path = '/upload2/'. explode('/', $file, 3)[2];

  is_dir(dirname($local_path)) || mkdir(dirname($local_path), 0777, true);

  copy($file, $local_path);
}
 
Переменная $local_pa th объявлена в глобальной области видимости и без конструкции use (&$local_path) к ней нет доступа внутри анонимной функции.
Третий параметр функции mkdir разрешает создание вложенных директорий, так что код можно сократить.
PHP:
$files = array(
  '/upload/images/2017/05/08/283/hi-res-786_22.jpg'
  '/upload/images/2016/11/01/283/hi-res-128_41.jpg'
  );

foreach( $files as $file)
{
  $local_path = '/upload2/'. explode('/', $file, 3)[2];

  is_dir(dirname($local_path)) || mkdir(dirname($local_path), 0777, true);

  copy($file, $local_path);
}
Просто белая страница, показ ошибок включен по максимуму. Ну и нечего не происходит, файлов или папки нет.
 
Последнее редактирование:
Я правильно понимаю, что результирующий путь должен быть такой ?
/upload2/images/2017/05/07/443/hi-res-5211_12.jpg
====
Кстати, обратите внимание что
/upload/images/2017/05/08/283/hi-res-786_22.jpg
это абсолютный путь, а я что-то сомневаюсь в его правильности, поэтому и ошибки летят, потому что файлов нету.

выполни

Код:
<?php echo getcwd(); ?>
из любой папки с картинкой, например /upload/images/2017/05/08/283

и
Код:
<?php echo $_SERVER['DOCUMENT_ROOT']; ?>
из любого места

P.S. К ознакомлению по путям в линуксе Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
  • Нравится
Реакции: NOIP
Я правильно понимаю, что результирующий путь должен быть такой ?
/upload2/images/2017/05/07/443/hi-res-5211_12.jpg
====
Кстати, обратите внимание что
/upload/images/2017/05/08/283/hi-res-786_22.jpg
это абсолютный путь, а я что-то сомневаюсь в его правильности, поэтому и ошибки летят, потому что файлов нету.

выполни

Код:
<?php echo getcwd(); ?>
из любой папки с картинкой, например /upload/images/2017/05/08/283

и
Код:
<?php echo $_SERVER['DOCUMENT_ROOT']; ?>
из любого места

P.S. К ознакомлению по путям в линуксе Для просмотра ссылки Войди или Зарегистрируйся

/home/НазваниеСайта/web/НазваниеСайта/public_html
 
У @Q_BASIC и @lag Parse Erorr всего лишь не хватает запятой:
PHP:
$files = array(
  '/upload/images/2017/05/08/283/hi-res-786_22.jpg',
  '/upload/images/2016/11/01/283/hi-res-128_41.jpg'
  );
Просто белая страница, показ ошибок включен по максимуму. Ну и нечего не происходит, файлов или папки нет.
Скорее всего эта ошибка упала в файлик error* рядом с запускаемым на хостинге файлом.

Вот это не запустится на старом php, ставь хотя бы 5.4, хотя он тоже давно устарел.
PHP:
 explode('/', $file, 3)[2]
 
  • Нравится
Реакции: NOIP
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху