Я успешно импортировал свой форум vBulletin 5 в Discourse. Хотя общий скрипт импорта работает корректно, при импорте вложений возникают ошибки. Вложения хранятся в моей базе данных и имеют следующие расширения: java, html, jpg, png, txt, rtf, zip, js и xml.
При отладке действия import_attachment я обнаружил, что корректно импортируются только вложения с расширением java. Скрипт не справляется с вложениями других расширений.
Сталкивался ли кто-нибудь ещё в сообществе с проблемами при импорте вложений с этими расширениями файлов? Есть ли у кого-то идеи, почему скрипт может не работать с этими типами файлов?
Вот краткое описание проблемы:
Первые три файла в моей базе данных имеют расширение java и импортируются без проблем.
Скрипт выдаёт ошибку при встрече файла с расширением jpg.
begin
upl_obj = create_upload(post.user.id, filename, real_filename)
if upl_obj&.persisted?
html = html_for_upload(upl_obj, real_filename)
if !post.raw[html]
post.raw += "\n\n#{html}\n\n"
post.save!
UploadReference.ensure_exist!(upload_ids: [upl_obj.id], target: post)
end
else
puts "Не удалось создать загрузку для #{filename}: #{upl_obj.errors.full_messages.join(", ")}"
next
end
rescue => e
puts "Ошибка обработки файла #{filename}: #{e.message}"
next
end
Мое предположение, которое может оказаться ошибочным, заключается в том, что проблема с кодировкой символов перевода строки приводит к некорректным данным в бинарных файлах, поскольку символ перевода строки интерпретируется как часть данных. Если работают только ASCII-файлы, это вполне вероятно.
Таким образом, проблема не в Discourse, а в MySQL.
Почти верно — дело не в кодировке новых строк, а в том, что файлы обрабатываются как текст, из-за чего они повреждаются.
EF BF BD — это последовательность байтов UTF-8 для символа «ЗАМЕНА» (U+FFFD). Это указывает на то, что файл обрабатывался как текст, а не как бинарный.
Изображение JPEG начинается с ff d8 ff e0 xx xx 4a 46 49 46 00.
Вы можете увидеть, что первые четыре байта были заменены на EF BF BD.
Таким образом, ваши изображения действительно повреждены. Это не проблема импортера, а проблема базы данных, как уже отметил @pfaffman. Если вы скопировали эту базу данных с другого сервера, стоит проверить, не было ли этой проблемы уже в исходной базе данных. Это также может происходить только с самыми старыми изображениями (если это случилось давно). Просто удалите строку exit и посмотрите, что произойдёт.
@RGJ Спасибо за помощь. Я попытался импортировать новую базу данных с правильными изображениями, и хотя импорт был выполнен, не все вложения были импортированы полностью. Я сталкиваюсь с такими ошибками:
Я не думаю, что импортер сможет с этим справиться.
Если память мне не изменяет, все теги [ATTACH] удаляются из сообщений, поскольку они излишни. Вероятно, здесь это не сработает, так как код не ожидает JSON-данные внутри них. Нужно будет найти место, где они удаляются, и модифицировать этот код, чтобы он учитывал JSON-данные внутри тега.
Перед импортом вложений я заметил, что сообщения с изображениями содержат теги [ATTACH]. После импорта некоторые из этих тегов заполнены корректно, а другие остались пустыми. Почему так происходит?
Ни одно из этих изображений не отображается правильно?
Похоже, что некоторые вложения vBulletin добавляются в базу данных, а некоторые включают bbcode, как в данном случае. Мне кажется, я уже модифицировал импорт, чтобы обрабатывать такие случаи ранее.
О, я не заметил JSON ранее. Вы ожидаете, что эти JSON-файлы будут вложениями, встроенными в сообщения? Как выглядят такие сообщения в vBulletin?
Полагаю, остальные ошибки возникли из-за того, что эти сообщения не были импортированы по какой-то причине (например, родительская тема была удалена или не была импортирована).
Я не думаю, что это файлы JSON, это метаданные в формате JSON.
Похоже, что vBulletin изменил кодировку местоположений вложений с
[attach]123[/attach]
на [attach=json]{"data-attachmentid":123}[/attach]
и импортер не может с этим справиться. Вложения должны прикрепляться в любом случае, эти теги нужны только для их позиционирования внутри поста. Но удаление тега происходит только тогда, когда он содержит числовой идентификатор.
Многие другие ошибки на скриншоте выше не зависят от этой проблемы.
Мне казалось, что я видел, что иногда база данных связывает их с постом, а иногда это делает bbcode, и, полагаю, иногда делают и то, и другое? А иногда они хранятся в базе данных, а иногда являются внешними файлами (но, возможно, я путаю это с какой-то другой системой).