Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Замена файлов с одинаковым названием


Recommended Posts

Всем здравствуйте!

Кто нибудь исправлял следующий косяк:

Когда заливаешь файл с названием, который когда то уже был залит, файл заменяется на новый, а не присваивается файлу какая нибудь цифра, типа новый файл(1), новый файл(2), не очень удобно, когда товар уже залит, заливаешь к нему картинку, а она заменяется где нибудь в другом товаре, кто знает как это исправить/доработать?

Версия 1.5.5.2

Змінено користувачем sergei5770
Надіслати
Поділитися на інших сайтах

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

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

Надіслати
Поділитися на інших сайтах

это не косяк сайта.

я считаю, что это недоработка разработчиков движка, по крайней мере хотя бы платное решение проблемы, но должно быть

Надіслати
Поділитися на інших сайтах

я считаю, что это недоработка разработчиков движка, по крайней мере хотя бы платное решение проблемы, но должно быть

Вы можете считать как угодно, чей это косяк.

Покупая книги, например собрания сочинений, вы не будете покупать два тома,  вы оставите один, в крайнем случае, вы их поставите рядом, но оба они будут одинаковыми томами, но книжная полка - это не машина

Или когда садитесь в поезд, то там будет только один 9-й вагон, и будет он после 8-го, а не перед 10-м :)

 

А если вам нужно заменить существующий файл?

 

Начните с самоорганизации себя

Надіслати
Поділитися на інших сайтах

А если вам нужно заменить существующий файл?

Удалить ненужный и залить новый с тем же именем :-D

Правда потом захочется и этот процесс автоматизировать и так до ...

Змінено користувачем Strelez
Надіслати
Поділитися на інших сайтах


Тут правда, лучше сразу начать порядок наводить, а то потом поздно: тормоза, путаница, сплошной геморой. Я на 1.5.5.1.2 вот эту адаптацию файлового менеджера использую. Мультизагрузка есть, случайно файлы не перезаписывает (правда и не переименовывает, просто не загружает), проблемные символы в названиях не пропускает. В принципе, переименование можно "запилить" самостоятельно попробовать.

Надіслати
Поділитися на інших сайтах


А ни кто не подскажет, как формировать имя файла по id, сижу копаю filemanager.php, как я понял он формирует имя где то здесь, но я скорей всего ошибаюсь:

$filename = basename(html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8')); 

Выборку максимального id я в принципе могу осуществить запросом:

$autoname_query1 = $this->db->query("SELECT MAX(product_image_id) FROM " . DB_PREFIX . "product_image");

Ну и получу следующий по списку id как то так

$autoname_query1->row["MAX(product_image_id)"]+1; 

Кто может подсказать, как мне этот id потом вписать в имя файла, даже скажем пусть не перезаписать имя, а добавить в конец, например, этот id?

Змінено користувачем sergei5770
Надіслати
Поділитися на інших сайтах

код для добавления номера к названию файла

$file = $filename;
$cnt = 1;
$fileextention = substr(strrchr($file, '.'), 0);
$filename = substr($file, 0, strrpos($file, '.'));
if(file_exists(DIR_FREEDOWNLOAD . $file))
{
	while(file_exists(DIR_FREEDOWNLOAD . $filename . $cnt . $fileextention))
		$cnt ++;
	$file = $filename . $cnt . $fileextention;
}
  • +1 1
Надіслати
Поділитися на інших сайтах


 

код для добавления номера к названию файла

$file = $filename;
$cnt = 1;
$fileextention = substr(strrchr($file, '.'), 0);
$filename = substr($file, 0, strrpos($file, '.'));
if(file_exists(DIR_FREEDOWNLOAD . $file))
{
	while(file_exists(DIR_FREEDOWNLOAD . $filename . $cnt . $fileextention))
		$cnt ++;
	$file = $filename . $cnt . $fileextention;
}

а куда вставлять код? в filemanager.php? после какой строчки?

Надіслати
Поділитися на інших сайтах


а куда вставлять код? в filemanager.php? после какой строчки?

Это пример, Вставлять в том месте, где формируется имя файла. DIR_FREEDOWNLOAD заменить на каталог изображений

Надіслати
Поділитися на інших сайтах


Это пример, Вставлять в том месте, где формируется имя файла. DIR_FREEDOWNLOAD заменить на каталог изображений

нашел это место

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

Надіслати
Поділитися на інших сайтах

Видимо что-то не так поправили... Надо смотреть код.

 

Я так понимаю эта функция отвечает за загрузку картинки, и сделал примерно так:

public function upload() {
		$this->language->load('common/filemanager');
		
		$json = array();
		
		
		if (isset($this->request->post['directory'])) {
			
			if (isset($this->request->files['image']) && $this->request->files['image']['tmp_name']) {		
		
				$filename = basename(html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8'));
				
				$file = $filename;
				$cnt = 1;
				$fileextention = substr(strrchr($file, '.'), 0);
				$filename = substr($file, 0, strrpos($file, '.'));
				if(file_exists('image/' . $file))
				{
				while(file_exists('image/' . $filename . $cnt . $fileextention))
				$cnt ++;
				$file = $filename . $cnt . $fileextention;
				}

				if ((strlen($filename) < 3) || (strlen($filename) > 255)) {
					$json['error'] = $this->language->get('error_filename');
				}
				
				$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');
				
				if (!is_dir($directory)) {
					$json['error'] = $this->language->get('error_directory');
				}
				
				if ($this->request->files['image']['size'] > 300000) {
					$json['error'] = $this->language->get('error_file_size');
				}
				
				$allowed = array(
					'image/jpeg',
					'image/pjpeg',
					'image/png',
					'image/x-png',
					'image/gif',
					'application/x-shockwave-flash'
				);
						
				if (!in_array($this->request->files['image']['type'], $allowed)) {
					$json['error'] = $this->language->get('error_file_type');
				}
				
				$allowed = array(
					'.jpg',
					'.jpeg',
					'.gif',
					'.png',
					'.flv'
				);
						
				if (!in_array(strtolower(strrchr($filename, '.')), $allowed)) {
					$json['error'] = $this->language->get('error_file_type');
				}
				
				if ($this->request->files['image']['error'] != UPLOAD_ERR_OK) {
					$json['error'] = 'error_upload_' . $this->request->files['image']['error'];
				}			
			} else {
				$json['error'] = $this->language->get('error_file');
			}
		} else {
			$json['error'] = $this->language->get('error_directory');
		}
		
		if (!$this->user->hasPermission('modify', 'common/filemanager')) {
      		$json['error'] = $this->language->get('error_permission');  
    	}
		
		if (!isset($json['error'])) {	
			if (@move_uploaded_file($this->request->files['image']['tmp_name'], $directory . '/' . $filename)) {		
				$json['success'] = $this->language->get('text_uploaded');
			} else {
				$json['error'] = $this->language->get('error_uploaded');
			}
		}
		
		$this->response->setOutput(json_encode($json));
	}
Надіслати
Поділитися на інших сайтах

 

после

{
    while(file_exists('image/' . $filename . $cnt . $fileextention))
    $cnt ++;
    $file = $filename . $cnt . $fileextention;
}

добавить

$filename = $file;

Файл стал загружаться, но он по прежнему перезаписывается, как будто игнорит проверку

Надіслати
Поділитися на інших сайтах

Все, разобрался, спасибо пользователю shalan, кароч пишу решение для версии 1.5.5.1(на счет остальных версий не знаю)

 

В файле admin/controller/common/filemanager.php, пишем:

 

В функции public function upload()

После

$filename = html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8');

Добавляем

$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

$file = $filename;
$cnt = 1;
$fileextention = substr(strrchr($file, '.'), 0);
$filename = substr($file, 0, strrpos($file, '.'));
if(file_exists(DIR_IMAGE . 'data/' . $file))
{
while(file_exists($directory . '/' . $filename . $cnt . $fileextention))
$cnt ++;
$file = $filename . $cnt . $fileextention;
}
$filename = $file;

После

if ((strlen($filename) < 3) || (strlen($filename) > 255)) {
$json['error'] = $this->language->get('error_filename');
} 

Удаляем

$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/'); 

Все, теперь к повторяющимся названиям будут прибавляться цифры 1,2,3 и т.д.

Змінено користувачем sergei5770
  • +1 1
Надіслати
Поділитися на інших сайтах

текущая директория видимо задается строкой
 

$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

т..е. вместо DIR_IMAGE используем $directory

Надіслати
Поділитися на інших сайтах


текущая директория видимо задается строкой

 

$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

т..е. вместо DIR_IMAGE используем $directory

перестает заливать картинки, просто зависает в загрузке

Надіслати
Поділитися на інших сайтах

код в студию

$file = $filename;
				$cnt = 1;
				$fileextention = substr(strrchr($file, '.'), 0);
				$filename = substr($file, 0, strrpos($file, '.'));
				if(file_exists($directory . $file))
				{
				while(file_exists($directory . $filename . $cnt . $fileextention))
				$cnt ++;
				$file = $filename . $cnt . $fileextention;
				}
				$filename = $file;
Надіслати
Поділитися на інших сайтах

...опять надо догадываться

переменная $directory инициализируется ниже чем используется

 

 

	public function upload() {
		$this->language->load('common/filemanager');
		
		$json = array();
		
		
		if (isset($this->request->post['directory'])) {
			
			if (isset($this->request->files['image']) && $this->request->files['image']['tmp_name']) {		
		
				$filename = html_entity_decode($this->request->files['image']['name'], ENT_QUOTES, 'UTF-8');
			
				$file = $filename;
				$cnt = 1;
				$fileextention = substr(strrchr($file, '.'), 0);
				$filename = substr($file, 0, strrpos($file, '.'));
				if(file_exists($directory . $file))
				{
				while(file_exists($directory . $filename . $cnt . $fileextention))
				$cnt ++;
				$file = $filename . $cnt . $fileextention;
				}
				$filename = $file;
				
				if ((strlen($filename) < 3) || (strlen($filename) > 255)) {
					$json['error'] = $this->language->get('error_filename');
				}
				
				$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');
							
				if (!is_dir($directory)) {
					$json['error'] = $this->language->get('error_directory');
				}
				
				
				if ($this->request->files['image']['size'] > 300000) {
					$json['error'] = $this->language->get('error_file_size');
				}
				
				$allowed = array(
					'image/jpeg',
					'image/pjpeg',
					'image/png',
					'image/x-png',
					'image/gif',
					'application/x-shockwave-flash'
				);
						
				if (!in_array($this->request->files['image']['type'], $allowed)) {
					$json['error'] = $this->language->get('error_file_type');
				}
				
				$allowed = array(
					'.jpg',
					'.jpeg',
					'.gif',
					'.png',
					'.flv'
				);
						
				if (!in_array(strtolower(strrchr($filename, '.')), $allowed)) {
					$json['error'] = $this->language->get('error_file_type');
				}
				
				if ($this->request->files['image']['error'] != UPLOAD_ERR_OK) {
					$json['error'] = 'error_upload_' . $this->request->files['image']['error'];
				}			
			} else {
				$json['error'] = $this->language->get('error_file');
			}
		} else {
			$json['error'] = $this->language->get('error_directory');
		}
		
		if (!$this->user->hasPermission('modify', 'common/filemanager')) {
      		$json['error'] = $this->language->get('error_permission');  
    	}
		
		if (!isset($json['error'])) {	
			if (@move_uploaded_file($this->request->files['image']['tmp_name'], $directory . '/' . $filename)) {		
				$json['success'] = $this->language->get('text_uploaded');
			} else {
				$json['error'] = $this->language->get('error_uploaded');
			}
		}
		
		$this->response->setOutput(json_encode($json));
	}

Так выглядит весь upload

Надіслати
Поділитися на інших сайтах

 

перенесите 

$directory = rtrim(DIR_IMAGE . 'data/' . str_replace('../', '', $this->request->post['directory']), '/');

выше чем

$file = $filename;

да яв первую очередь это сделал, он начинает перезаписывать файлы снова

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.