vBulletin 5 포럼을 Discourse로 성공적으로 가져왔습니다. 전체 가져오기 스크립트는 정상적으로 작동하지만, 첨부 파일을 가져올 때 오류가 발생하고 있습니다. 첨부 파일은 데이터베이스에 저장되어 있으며, 확장자는 java, html, jpg, png, txt, rtf, zip, js, xml입니다.
import_attachment 액션을 디버깅해 본 결과, java 확장자를 가진 첨부 파일만 정상적으로 가져오고 있었습니다. 다른 확장자를 가진 첨부 파일에 대해서는 스크립트가 실패합니다.
커뮤니티에서 이 확장자의 첨부 파일을 가져올 때 유사한 문제를 겪어 보신 분이 계신가요? 왜 이 특정 파일 형식에서 스크립트가 실패하는지에 대한 통찰이 있으신 분이 계신가요?
문제의 개요는 다음과 같습니다:
데이터베이스의 첫 번째 세 파일은 java 확장자를 가지고 있으며 문제 없이 가져와집니다.
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
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라인을 제거하고 어떤 일이 일어나는지 확인해 보세요.
기억이 정확하다면, 불필요하기 때문에 모든 [ATTACH] 태그가 게시물에서 제거됩니다. 여기서는 태그 안에 JSON 데이터가 있는 것을 예상하지 않기 때문에 아마 작동하지 않을 것입니다. 태그가 제거되는 위치를 찾아서 태그 내부의 JSON 데이터를 처리하도록 해당 코드를 수정하는 것이 필요할 것입니다.
이것들은 JSON 파일이 아니라 JSON 메타데이터라고 생각합니다.
vBulletin이 첨부 파일 위치 인코딩 방식을 다음과 같이 변경한 것으로 보입니다:
[attach]123[/attach]
에서
[attach=json]{"data-attachmentid":123}[/attach]
으로 변경되었고, 가져오기(importer) 도구가 이를 처리하지 못하고 있습니다. 이 태그들은 게시글 내에서 첨부 파일을 위치시키기 위한 용도뿐이므로, 어쨌든 첨부 파일은 첨부되어야 합니다. 하지만 태그가 삭제되는 경우는 태그 안에 숫자 ID가 포함된 경우에만 발생합니다.
데이터베이스가 게시글에 태그를 연결하는 경우가 있고, bbcode가 연결하는 경우가 있으며, 때로는 두 방식이 모두 사용되는 것 같다는 생각을 했습니다. 그리고 태그가 데이터베이스에 저장되는 경우도 있고 외부 파일인 경우도 있는 것 같더군요(하지만 다른 시스템에 대한 기억일 수도 있습니다).