Проблема импорта phpBB

Не редкость, когда при загрузке файлов встречаются дубликаты имён — каждая доска должна это учитывать. Однако в phpBB можно загрузить два вложения с разными изображениями, но с одинаковым именем, в одном и том же сообщении. phpBB решает эту проблему, сохраняя исходное имя файла в поле «real_filename» в таблице вложений, а сгенерированное хешированное имя — в поле «physical_filename».

У меня есть 46 сообщений, конвертированных из моего форума phpBB, которые содержат дубликаты изображений из-за совпадения имён файлов. В некоторых случаях это произошло потому, что пользователь случайно загрузил один и тот же файл дважды. Но во многих случаях — нет. Я не уверен, как именно пользователь это сделал, но у меня есть пример, где он загрузил 11 разных изображений в phpBB, каждое с именем «image.jpg» (имя по умолчанию при перетаскивании картинки из письма на рабочий стол). В результате одно и то же изображение появилось в Discourse 11 раз. Похоже, конвертер идентифицирует вложение из phpBB для загрузки по полю real_filename — которое допускает дубликаты — вместо physical_filename.

К счастью, у меня есть скрипт на Ruby, который находит в PostgreSQL сообщения, содержащие одно и то же имя файла в Discourse дважды. Это будет неприятно (особенно для сообщения с 11 дубликатами!), но я смогу исправить это вручную, поскольку мой форум phpBB всё ещё существует. Но стоит отметить это как важную поправку, так как я ожидаю, что многие администраторы phpBB последуют моему примеру и перейдут на другую платформу.

Спасибо,
Дэн

1 лайк

Кстати, по мнению Claude, проблема находится на строке 24 в файле
/var/www/discourse/script/import_scripts/phpbb3/importers/attachment_importer.rb.

Ошибка: Когда у нескольких вложений phpBB одинаковое real_filename (например, “IMG_1234.jpg”), загрузчик видит, что имя файла уже существует, и возвращает существующую загрузку вместо создания новой, даже если physical_filename (фактический файл) отличается.

Решение: Использовать physical_filename в качестве имени файла или добавлять attach_id для обеспечения уникальности.

Вместо
filename = CGI.unescapeHTML(row[:real_filename])

Использовать:
filename = “#{row[:attach_id]}_#{CGI.unescapeHTML(row[:real_filename])}”

Звучит как неплохая идея.

1 лайк