He importado con éxito mi foro vBulletin 5 a Discourse. Si bien el script de importación general funciona bien, estoy encontrando errores al importar los archivos adjuntos. Los archivos adjuntos se almacenan en mi base de datos e incluyen las siguientes extensiones: java, html, jpg, png, txt, rtf, zip, js y xml.
Tras depurar la acción import_attachment, descubrí que solo se importan correctamente los archivos adjuntos con la extensión java. El script falla para los archivos adjuntos con otras extensiones.
¿Alguien más en la comunidad se ha enfrentado a problemas al importar archivos adjuntos con estas extensiones de archivo? ¿Alguien tiene información sobre por qué el script podría estar fallando con estos tipos de archivo en particular?
Aquí hay una breve descripción general del problema:
Los tres primeros archivos de mi base de datos tienen la extensión java y se importan sin problemas.
El script falla cuando encuentra un archivo con la extensión 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 "Falló la creación de la carga para #{filename}: #{upl_obj.errors.full_messages.join(", ")}"
next
end
rescue => e
puts "Error al procesar el archivo #{filename}: #{e.message}"
next
end
Mi suposición, que podría estar equivocada, es que un problema con la codificación de saltos de línea hace que los datos en los archivos binarios sean incorrectos porque un carácter de salto de línea se codifica como datos. Si los únicos archivos que funcionan son los ASCII, es una buena apuesta.
Entonces, no es un problema de Discourse, sino un problema de MySQL.
Casi, no es la codificación de saltos de línea, sino que se trata como texto y, por lo tanto, se corrompe.
EF BF BD es la secuencia de bytes UTF-8 para ‘CARÁCTER DE REEMPLAZO’ (U+FFFD). Esto es indicativo de que un archivo se está tratando como texto en lugar de binario.
Una imagen JPEG comienza con ff d8 ff e0 xx xx 4a 46 49 46 00
Puedes ver que los primeros cuatro bytes han sido reemplazados cada uno con EF BF BD.
Por lo tanto, tus imágenes están efectivamente corruptas. Este no es un problema con el importador, es un problema con la base de datos, como ya dijo @pfaffman. Si has copiado esta base de datos de otro servidor, es posible que desees comprobar si este ya es un problema en la base de datos original. Esto también podría estar ocurriendo solo en las imágenes más antiguas (si esto ocurrió hace mucho tiempo). Simplemente elimina el exitlínea y observa qué sucede.
@RGJ Gracias por la ayuda. Intenté importar una nueva base de datos con las imágenes correctas y, aunque se importó, no todos los archivos adjuntos se importaron completamente. Me encuentro con errores como este:
Si mal no recuerdo, todas las etiquetas [ATTACH] se eliminan de las publicaciones ya que son superfluas. Probablemente eso no funcione aquí porque no espera datos JSON en ellas. Sería cuestión de buscar el lugar donde se eliminan y modificar ese código para tener en cuenta los datos JSON dentro de la etiqueta.
Antes de importar los archivos adjuntos, noto que las publicaciones con imágenes contienen etiquetas [ATTACH]. Después de la importación, algunas de estas etiquetas se rellenan correctamente mientras que otras quedan vacías. ¿Por qué es eso?
Como dije, esas etiquetas son superfluas, pero la lógica de eliminación de etiquetas no espera ese código JSON, por lo que no las está eliminando correctamente.
Creo que algunos adjuntos de vBulletin los añaden a la base de datos y otros incluyen bbcode como ese. Creo que he modificado la importación para manejarlos antes.
Oh, no me había dado cuenta del json antes. ¿Esperas que estos archivos json sean archivos adjuntos incrustados en las publicaciones? ¿Cómo se ven esas publicaciones en vBulletin?
Creo que los otros errores se deben a que esas publicaciones no se importaron por alguna razón (como que el tema principal fue eliminado o no se importó).
No creo que estos sean archivos json, son metadatos json.
Parece que vBulletin cambió su codificación de ubicaciones de archivos adjuntos de
[attach]123[/attach]
a
[attach=json]{"data-attachmentid":123}[/attach]
y el importador no puede manejar eso. Debería adjuntar los archivos adjuntos de todos modos, estas etiquetas son solo para posicionarlos dentro de la publicación. Pero la eliminación de la etiqueta solo ocurre cuando contienen un ID numérico.
Muchos otros errores en la captura de pantalla anterior son independientes de este problema.
Pensé que había visto que a veces la base de datos los vinculaba a la publicación y a veces el bbcode lo hacía, ¿y supongo que a veces ambos lo hacen? Y a veces viven en la base de datos y a veces son archivos externos (pero podría estar recordando algún otro sistema en eso).