vBulletin 5 데이터베이스 마이그레이션 - 첨부 파일 확장자 관련 오류

vBulletin 5 포럼을 Discourse로 성공적으로 가져왔습니다. 전체 가져오기 스크립트는 정상적으로 작동하지만, 첨부 파일을 가져올 때 오류가 발생하고 있습니다. 첨부 파일은 데이터베이스에 저장되어 있으며, 확장자는 java, html, jpg, png, txt, rtf, zip, js, xml입니다.

import_attachment 액션을 디버깅해 본 결과, java 확장자를 가진 첨부 파일만 정상적으로 가져오고 있었습니다. 다른 확장자를 가진 첨부 파일에 대해서는 스크립트가 실패합니다.

커뮤니티에서 이 확장자의 첨부 파일을 가져올 때 유사한 문제를 겪어 보신 분이 계신가요? 왜 이 특정 파일 형식에서 스크립트가 실패하는지에 대한 통찰이 있으신 분이 계신가요?

문제의 개요는 다음과 같습니다:

  • 데이터베이스의 첫 번째 세 파일은 java 확장자를 가지고 있으며 문제 없이 가져와집니다.
  • 스크립트는 jpg 확장자를 가진 파일을 만나면 실패합니다.

@pfaffman 조언이나 해결책이 있다면 큰 도움이 될 것입니다!

무엇이 일어나고 있는지 확인하려면 디버깅용 put 문장을 몇 개 추가해야 합니다.

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

그리고 다음과 같은 오류를 확인했습니다.

이 오류는 jpg, jpeg, png, PNG, gif 확장자의 파일에서 발생합니다.

이 오류에 대해 혹시 아이디어가 있으신가요? @pfaffman

동작한 파일은 ASCII 파일뿐이었습니다. 인코딩 오류인 것 같습니다.

데이터베이스의 파일이나 가져오기 스크립트의 인코딩에 문제가 있나요? @pfaffman


다른 파일들이 인코딩되어 있다면, 왜 jpg, png 등 이러한 확장자는 그렇지 않나요?

제 추측은, 틀릴 수도 있지만, 줄바꿈 인코딩 문제로 인해 줄바꿈 문자가 데이터로 인코딩되면서 바이너리 파일의 데이터가 손상된다는 것입니다. ASCII 파일만 작동한다면, 이 추측이 맞을 가능성이 높습니다.

따라서 이는 Discourse의 문제가 아니라 MySQL의 문제입니다.

거의 맞습니다. 줄바꿈 인코딩 문제가 아니라, 텍스트로 취급되어 손상된 것이죠.

EF BF BD는 ‘REPLACEMENT CHARACTER’(U+FFFD)에 해당하는 UTF-8 바이트 시퀀스입니다. 이는 파일이 바이너리가 아닌 텍스트로 취급되었음을 나타냅니다.

JPEG 이미지는 ff d8 ff e0 xx xx 4a 46 49 46 00으로 시작합니다.

첫 번째 바이트 4개가 각각 EF BF BD로 대체되었음을 확인할 수 있습니다.

따라서 이미지는 실제로 손상된 것입니다. 이는 가져오기(importer)의 문제가 아니라, @pfaffman이 이미 언급했듯이 데이터베이스의 문제입니다. 이 데이터베이스를 다른 서버에서 복사해 온 경우, 원본 데이터베이스에서도 이미 이러한 문제가 발생하고 있는지 확인해 보시는 것이 좋습니다. 오래된 이미지에서만 이런 현상이 발생할 수도 있습니다(오래전에 이런 일이 발생했다면). exit 라인을 제거하고 어떤 일이 일어나는지 확인해 보세요.

@RGJ 도움 주셔서 감사합니다. 올바른 이미지가 포함된 새 데이터베이스를 가져오려고 했는데, 가져오기는 되었는데 모든 첨부 파일이 완전히 가져와지지 않았습니다. 다음과 같은 오류가 발생하고 있습니다:

이런 일이 발생하는 이유가 무엇인지 혹시 아시는 분 계신가요? @RGJ @pfaffman

게시글이 다음과 같이 표시되고 있으며, 이러한 사례가 많습니다:

그 임포터가 그런 것을 처리할 수 있다고 생각하지 않습니다.

기억이 정확하다면, 불필요하기 때문에 모든 [ATTACH] 태그가 게시물에서 제거됩니다. 여기서는 태그 안에 JSON 데이터가 있는 것을 예상하지 않기 때문에 아마 작동하지 않을 것입니다. 태그가 제거되는 위치를 찾아서 태그 내부의 JSON 데이터를 처리하도록 해당 코드를 수정하는 것이 필요할 것입니다.

첨부 파일을 가져오기 전에 이미지로 된 게시물에는 [ATTACH] 태그가 포함되어 있는 것을 확인했습니다. 가져오기 완료 후 일부 태그에는 값이 올바르게 채워진 반면, 다른 태그는 비어 있는 경우가 있습니다. 왜 그런가요?

말했듯이, 그 태그들은 불필요하지만, 태그 제거 로직은 해당 JSON 코드를 예상하지 않기 때문에 올바르게 제거하지 못하고 있습니다.

그 이미지들이 제대로 표시되지 않나요?

vBulletin의 일부는 이미지를 데이터베이스에 추가하여 첨부하고, 일부는 그런 방식으로 BBCode를 포함하는 것 같습니다. 이전에 가져오기를 수정해서 그 부분을 처리한 것 같습니다.

네, 이 파일들이 표시되지 않아요.
12,500개 첨부파일 중 1,000개에서 오류가 발생했어요.
이 파일들을 어떻게 업로드할 수 있을까요?

아, 전에 json 파일을 못 봤네요. 이 json 파일들이 게시물에 첨부파일로 삽입되길 기대하고 계신 건가요? vBulletin에서 해당 게시물은 어떤 모습인가요?

나머지 오류는 해당 게시물이 어떤 이유로든(예: 상위 토픽이 삭제되었거나 가져오지 못함 등) 가져오지 못했기 때문일 것이라고 생각합니다.

이것들은 JSON 파일이 아니라 JSON 메타데이터라고 생각합니다.
vBulletin이 첨부 파일 위치 인코딩 방식을 다음과 같이 변경한 것으로 보입니다:

[attach]123[/attach]

에서

[attach=json]{"data-attachmentid":123}[/attach]

으로 변경되었고, 가져오기(importer) 도구가 이를 처리하지 못하고 있습니다. 이 태그들은 게시글 내에서 첨부 파일을 위치시키기 위한 용도뿐이므로, 어쨌든 첨부 파일은 첨부되어야 합니다. 하지만 태그가 삭제되는 경우는 태그 안에 숫자 ID가 포함된 경우에만 발생합니다.

위 스크린샷에 보이는 많은 다른 오류들은 이 문제와 무관합니다.

데이터베이스가 게시글에 태그를 연결하는 경우가 있고, bbcode가 연결하는 경우가 있으며, 때로는 두 방식이 모두 사용되는 것 같다는 생각을 했습니다. 그리고 태그가 데이터베이스에 저장되는 경우도 있고 외부 파일인 경우도 있는 것 같더군요(하지만 다른 시스템에 대한 기억일 수도 있습니다).

네, 대략 맞습니다. 다만 제 생각에는 vBulletin 5에서는 항상 데이터베이스를 통해 처리됩니다.