Migración de la base de datos de vBulletin 5: errores en la importación de adjuntos sobre extensiones de archivos

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.

@pfaffman ¡Cualquier consejo o solución sería muy apreciado!

Necesitarás agregar algunas sentencias put de depuración para ver qué está sucediendo.

Agregué una declaración de depuración en 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 "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

y veo estos errores

estos errores son en las extensiones jpg, jpeg, png, PNG, gif

¿alguna idea sobre estos errores? @pfaffman

Los únicos archivos que funcionaron son ascii. Mi suposición es un error de codificación.

¿Hay un problema con los archivos en la base de datos o un problema de codificación del script de importación? @pfaffman


¿Ver estos archivos si otros están codificados, entonces por qué estas extensiones, por ejemplo, jpg, png, etc., no lo están?

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.

1 me gusta

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 exit línea y observa qué sucede.

1 me gusta

@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:

¿Alguna idea de por qué está sucediendo esto? @RGJ @pfaffman

Las publicaciones aparecen así, y hay muchos casos:

No creo que el importador pueda manejar eso.

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.

¿Ninguna de esas imágenes se muestra bien?

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.

Sí, estos no se muestran.
Recibí errores en 1000 archivos adjuntos de 12.5k.
¿Cómo puedo subirlos?

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.

1 me gusta

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).

Sí, eso es bastante correcto. Pero hasta donde sé, en vBulletin 5 siempre es a través de la base de datos.

1 me gusta