Перейти к содержанию
sergei5770

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

Рекомендуемые сообщения

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

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

Когда заливаешь файл с названием, который когда то уже был залит, файл заменяется на новый, а не присваивается файлу какая нибудь цифра, типа новый файл(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;
  • +1 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

после

{
    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 инициализируется ниже чем используется

 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

переменная $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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.