Не удается удалить файл рисунок по FTP

12
kolchakA
На сайте с 19.06.2010
Offline
226
2087

Мой скрипт заливает рисунки с удаленного сервера себе на сайт. Но после этого удалить рисунки становится невозможно (и изменить атрибуты самих рисунков тоже). Кто нибудь сталкивался с подобной ситуацией?

Автоматизация для SEO : подключение API, пайпланы из нескольких сервисов, AI генерация контента
[Удален]
#1

Зайдите под рутом и проблем не будет со сменой атрибутов и удалением.

kolchakA
На сайте с 19.06.2010
Offline
226
#2
Сашко:
Зайдите под рутом и проблем не будет со сменой атрибутов и удалением.

разве можно зайти на shared hosting ftp под рутом? опять же, почему именно эти файлы не удается удалять?

Ниже приведена моя функция, которая вытягивает изображения к себе на хост. Может код поможет прояснить ситуацию?


/**
* Сохраняем все изображения в тексте
*
* string @text Текст, в котором будет производиться поиск и загрузка изображения
* string @link Ссылка на страницу, текст с которой обрабатывается
* int @maxSize Максимальный размер сохраненных файлов(в кб)
* int @width Ширина изображения. Если width == -1, либо не передан, то будет подставляться исходное значение
* int @height Высота изображения. Если height == -1, либо не передан, то будет подставляться исходное значение
*/
function saveAllImages($text, $link, $maxSize, $width = -1, $height = -1) {

static $size = -1;

// Куда сохранять
$save_to = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';

// Путь относительно сайта
$site_path = '/uploads/';

// Переводим кб -> б
$maxSize *= 1024;

// Проверяем - папка ли?
if(!is_dir($save_to)) {
echo 'Error: folder <b>', $save_to, '</b> does not exist.';echo "\n";
return $text;
}

// Проверяем права
$mod = substr(sprintf('%o', fileperms($save_to)), -4);
if($mod != '0777') {
echo 'Error: incorrect permissions (', $mod, ') for folder <b>',$save_to,'</b>';echo "\n";
return $text;
}

// Получаем размер уже загруженных файлов
if($size == -1) {
$size = getDirSize($save_to);
}

$text = preg_replace('#<img\s++([^<>]{0,500})src\s*+=\s*+(?:\'|")([^\'"<>]+)(?:\'|")\s*+([^<>]{0,500})>#is', '<img $1 src="$2" $3>', $text);
$text = preg_replace('#<img\s++([^<>]{0,500})src\s*+=\s*+([^\'"<>\s]+)([^<>]{0,500})>#is', '<img $1src="$2"$3>', $text);
$tmp_name = '';

// Вырезаем все изображения
preg_match_all('#(<img[^><]{6,500}>)#is', $text, $images);
foreach($images[1] as $img) {
// Проверяем - не превышен ли лимит на размер?
if($size > $maxSize) {
echo 'Attention: the limited size of images folder is exceeded'; echo "\n";
break;
}

$good = false;
$err_code = 0;
do {
// Проверяем - надо ли менять width и height?
$w = $width;
if($width == -1) {
$w = '';
if(preg_match('#width\s*+=\s*+(\'|")(\d++)\\1#i', $img, $data)) {
$w = $data[2];
}

if(preg_match('#width\s*+=\s*+(\d++)#i', $img, $data)) {
$w = $data[1];
}
}

$h = $height;
if($height == -1) {
$h = '';
if(preg_match('#height\s*+=\s*+(\'|")(\d++)\\1#i', $img, $data)) {
$h = $data[2];
}

if(preg_match('#height\s*+=\s*+(\d++)#i', $img, $data)) {
$h = $data[1];
}
}

// Получаем ссылку на изображение
if(!preg_match('#src="([^"]++)"#is', $img, $data)) {
$err_code = 1;
break;
}
$src = createFullLink($link, $data[1]);

// Получаем имя хоста + путь к изображению
if(!preg_match('#^(?:http://)?((?:[0-9a-z_-]++\.)++[0-9a-z]{2,5})(/.++)$#is', $src, $data)) {
$err_code = 2;
break;
}
list(, $host, $get) = $data;
$get = str_replace('%2F', '/', rawurlencode($get));

// Сохраняем изображение

// Соединяемся
if(!($fs = @fsockopen($host, 80, $errno, $errstr, 3))) {
$err_code = 4;
break;
}

// Отправляем запрос
$request = "GET {$get} HTTP/1.0\r\n";
$request .= "Host: {$host}\r\n";
$request .= "Referer: {$link}\r\n";
$request .= "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n";
$request .= "Accept-Language: ru\r\n";
$request .= "Accept-Charset: windows-1251, utf-8;q=0.6, *;q=0.1\r\n";
$request .= "Expires: no-store, no-cache, must-revalidate\r\n";
$request .= "Cache-Control: no-cache\r\n";
$request .= "User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.2.15 Version/10.00\r\n";
$request .= "Connection: close\r\n";
$request .= "\r\n";
if(!fwrite($fs, $request)) {
break;
}

// Генерируем имя временного файла
$tmp_name = md5(time() . md5(rand(1024, 65536)));
while(file_exists($save_to . $tmp_name)) {
$tmp_name = md5(time() . md5(rand(1024, 65536)));
}
$tmp_name = $save_to . $tmp_name;
$blabla = fopen($tmp_name, 'wb');
if(!$blabla) {
$err_code = 3;
fclose($fs);
break;
}

// Получаем ответ, сохраняя его в файл
$readed = 0;
$h = true;
while(!feof($fs)) {
$buffer = fgets($fs, 512);

if($h == true) {
if(strlen($buffer) < 3) {
$h = false;
}
else if(in_array($buffer, array("\r", "\n", "\r\n", "\n\r", ''))) {
$h = false;
}

continue;
}

if(!fputs($blabla, $buffer)) {
$err_code = 5;
break;
}

$readed += strlen($buffer);
if($readed > 4194304) {
$err_code = 6;
break;
}
}
fclose($blabla);
fclose($fs);
unset($blabla);

if($err_code > 0) {
break;
}

// Проверяем - сохранилась ли?
if(filesize($tmp_name) == 0) {
$err_code = 7;
break;
}

// Пытаемся определить тип изображения
$type = '';
if(!($res = @getimagesize($tmp_name))) {
$err_code = 8;
break;
}

switch($res[2]) {
case 1: {
$type = 'gif';
break;
}
case 2: {
$type = 'jpg';
break;
}
case 3: {
$type = 'png';
break;
}
}

if($type == '') {
$err_code = 9;
break;
}

// Получаем путь к изображению
$fileDir = substr(md5($host), 0, 10) . '/';
if(!is_dir($save_to . $fileDir)) {
if(!mkdir($save_to . $fileDir)) {
$err_code = 10;
break;
}
}
$fileName = substr(md5($get), 0, 10) . '.' . $type;

if(file_exists($save_to . $fileDir . $fileName)) {
$size -= filesize($save_to . $fileDir . $fileName);
}

if(!@copy($tmp_name, $save_to . $fileDir . $fileName)) {
$err_code = 11;
$size += filesize($save_to . $fileDir . $fileName);
break;
}
$size += filesize($save_to . $fileDir . $fileName);


if($size > $maxSize) {
$err_code = 12;
unlink($save_to . $fileDir . $fileName);
break;
}

// Генерируем новый код для изображения
$new_img = '<img src="'.$site_path . $fileDir . $fileName . '"';
if($w != '') {
$new_img .= ' width="'.$w.'"';
}
if($h != '') {
$new_img .= ' height="'.$h.'"';
}

$new_img .= '>';
$text = str_replace($img, $new_img, $text);
$good = true;
} while(false);
if($tmp_name != '' && file_exists($tmp_name)) { unlink($tmp_name); }

// echo $img, ' -> ', ($good ? 'ok' : 'err'), " err_code: {$err_code}\n";

// Если сохранение не прошло успешно - удаляем изображение
if(!$good) {
$text = str_replace($img, '', $text);
}

if($size > $maxSize) {
echo 'Attention: the limited size of images folder is exceeded'; echo "\n";
break;
}
}

return $text;
}
C
На сайте с 07.05.2010
Offline
243
#3

Движок создает файлы под пользователем apache. Потом вы заходите на ftp под другим пользователем - и не сможете ничего сделать. Поможет только админ. Если вы на VDS - вход в панель управления под root и делаете что хотите.

kolchakA
На сайте с 19.06.2010
Offline
226
#4
ctit:
Движок создает файлы под пользователем apache. Потом вы заходите на ftp под другим пользователем - и не сможете ничего сделать. Поможет только админ. Если вы на VDS - вход в панель управления под root и делаете что хотите.

могу ли я каким то образом создавать файлы под тем же пользователем, под которым я захожу чтобы их в последствии удалить?

O
На сайте с 29.05.2008
Offline
195
#5

А папка не удаляется?

[Удален]
#6
kolchakA:
могу ли я каким то образом создавать файлы под тем же пользователем, под которым я захожу чтобы их в последствии удалить?

Этот вопрос нужно задавать хостеру.

Как правильно выше сказали - скрипт работает с правами апача, в ты на фтп заходишь с правами юзера. Тут или нужно передать права юзера скрипту или получить права апача. Просто так свои права скрипту не передашь - зависит от настроек хостера. Поэтому с этим вопросом к нему.

Но есть вариант - удалять файлы скриптом ;)

C
На сайте с 07.05.2010
Offline
243
#7
kolchakA:
могу ли я каким то образом создавать файлы под тем же пользователем, под которым я захожу чтобы их в последствии удалить?

Можно по ftp залить пустышки с таким же именем, а движок их будет просто перезаписывать. Однако у ваших картинки вроде рэндомные имена.

У нас была полегче ситуация. Все файлы имели известные имена.

Аскет
На сайте с 15.11.2010
Offline
1
#8

Попробуй написать скрипт для удаления файлов о_О раз ты их скриптом создавал и есть заморочки с правами (сталкивался с подобным,файл созданый с правами вэб-сервера не удалялся по ФТП, но удалялся другим скриптом)

vinnipuh
На сайте с 25.11.2010
Offline
4
#9

Попробуйте через php)


<?php
unlink ('file.txt');
?>
Всегда постараюсь помочь советом :-) А ещё Вы можете заказать у меня разработку PHP-скриптов (/ru/forum/572825) :-)
WT
На сайте с 08.10.2010
Offline
17
#10

Если Вам надо удалить существующие уже файлы - воспользуйтесь приведенными выше советами.

Если не хотите, чтобы ситуация повторялась в будущем - ставьте на создаваемые файлы права 0777, это даст доступ к файлам от имени любого пользователя.

Но если есть какие-то особенные требования по безопасности, то придется придумывать что-нибудь эдакое, чтобы "и волки сыты, и овцы целы" оказались

За еду не работаю, зарабатываю здесь (http://www.sape.ru/r.amStvLXttk.php) Работа для ленивых - продвигай сайты автоматически (http://seopult.ru/ref.php?ref=1f6f897913cc593f)
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий