J’ai importé avec succès mon forum vBulletin 5 dans Discourse. Bien que le script d’importation global fonctionne correctement, je rencontre des erreurs lors de l’importation des pièces jointes. Les pièces jointes sont stockées dans ma base de données et incluent les extensions suivantes : java, html, jpg, png, txt, rtf, zip, js et xml.
Après avoir débogué l’action import_attachment, j’ai découvert que seules les pièces jointes avec l’extension java sont importées correctement. Le script échoue pour les pièces jointes avec d’autres extensions.
Quelqu’un d’autre dans la communauté a-t-il rencontré des problèmes lors de l’importation de pièces jointes avec ces extensions de fichiers ? Quelqu’un a-t-il des éclaircissements sur la raison pour laquelle le script pourrait échouer avec ces types de fichiers particuliers ?
Voici un bref aperçu du problème :
Les trois premiers fichiers de ma base de données ont l’extension java et sont importés sans problème.
Le script échoue lorsqu’il rencontre un fichier avec l’extension jpg.
J’ai ajouté une instruction de débogage sur upl_obj
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 "Failed to create upload for #{filename}: #{upl_obj.errors.full_messages.join(", ")}"
next
end
rescue => e
puts "Error processing file #{filename}: #{e.message}"
next
end
Mon hypothèse, qui pourrait être erronée, est qu’un problème d’encodage des sauts de ligne corrompt les données dans les fichiers binaires, car un caractère de saut de ligne est encodé comme une donnée. Si seuls les fichiers ASCII fonctionnent, c’est un bon pari.
Ce n’est donc pas un problème de Discourse, mais un problème de MySQL.
Presque - pas l’encodage de nouvelle ligne, mais traité comme du texte, et donc corrompu.
EF BF BD est la séquence d’octets UTF-8 pour ‘CARACTÈRE DE REMPLACEMENT’ (U+FFFD). Ceci indique qu’un fichier est traité comme du texte au lieu d’être binaire.
Une image JPEG commence par ff d8 ff e0 xx xx 4a 46 49 46 00
Vous pouvez voir que les quatre premiers octets ont chacun été remplacés par EF BF BD.
Vos images sont donc bien corrompues. Ce n’est pas un problème avec l’importateur, c’est un problème avec la base de données, comme @pfaffman l’a déjà dit. Si vous avez copié cette base de données d’un autre serveur, vous voudrez peut-être vérifier si c’est déjà un problème dans la base de données d’origine. Cela pourrait aussi ne se produire que sur les images les plus anciennes (si cela s’est produit il y a longtemps). Supprimez simplement le exitligne et voyez ce qui se passe.
@RGJ Merci pour votre aide. J’ai essayé d’importer une nouvelle base de données avec les bonnes images, et bien qu’elle ait été importée, toutes les pièces jointes n’ont pas été entièrement importées. Je rencontre des erreurs comme celle-ci :
Je ne pense pas que l’importateur puisse gérer cela.
Si je me souviens bien, toutes les balises [ATTACH] sont supprimées des publications car elles sont superflues. Cela ne fonctionne probablement pas ici car il ne s’attend pas à des données JSON. Il faudrait trouver l’endroit où elles sont supprimées et modifier ce code pour tenir compte des données JSON à l’intérieur de la balise.
Avant d’importer les pièces jointes, je remarque que les publications contenant des images comportent des balises [ATTACH]. Après l’importation, certaines de ces balises sont correctement remplies tandis que d’autres restent vides. Pourquoi ?
Comme je l’ai dit, ces balises sont superflues, mais la logique de suppression des balises ne s’attend pas à ce code JSON, elle ne les supprime donc pas correctement.
Je pense que certains vBulletin les attachent en les ajoutant à la base de données et d’autres incluent du bbcode comme ça. Je pense que j’ai modifié l’importation pour gérer cela auparavant.
Oh, je n’avais pas remarqué le JSON auparavant. Attendez-vous à ce que ces fichiers JSON soient des pièces jointes intégrées dans les publications ? À quoi ressemblent ces publications dans vBulletin ?
Je crois que les autres erreurs sont dues au fait que ces publications n’ont pas été importées pour une raison quelconque (comme si le sujet parent avait été supprimé ou n’avait pas été importé).
Je ne pense pas qu’il s’agisse de fichiers json, il s’agit de métadonnées json.
Il semble que vBulletin ait changé son encodage des emplacements des pièces jointes de
[attach]123[/attach]
à
[attach=json]{"data-attachmentid":123}[/attach]
et l’importateur ne peut pas gérer cela. Il devrait attacher les pièces jointes de toute façon, ces balises servent uniquement à les positionner dans le message. Mais la suppression de la balise ne se produit que lorsqu’elles contiennent un identifiant numérique.
Beaucoup d’autres erreurs dans la capture d’écran ci-dessus sont indépendantes de ce problème.
Je pensais avoir vu que parfois la base de données les liait au message et parfois le bbcode le faisait, et je suppose que parfois les deux le font ? Et parfois ils vivent dans la base de données et parfois ce sont des fichiers externes (mais je confonds peut-être avec un autre système).