이 문제에 대해 좀 더 파고들어 보았습니다.
간단히 말하면, 해당 파일이 이 유형의 파일과 동일한 시그니처로 시작하기 때문에 JPEG로 인식되고 있습니다.
Discourse에서 이 동작을 수정하는 것은 가능하지만, 수정 작업이 필요합니다. (끝에 참고)
아래는 기술적인 내용입니다.
이 문제는 여기서 시작됩니다:
FastImage 라이브러리가 파일을 열고 유형과 크기를 결정합니다.
예상하셨듯이, JPEG 유형을 반환합니다.
JPEG 시그니처가 어떤 모습인지 살펴보면 다음과 같습니다:
JPEG 마커
더 많은 정보: List of file signatures - Wikipedia
JPEG - Wikipedia
항상 다음 마커 바이트로 시작합니다: FF D8
Hex 편집기로 파일 샘플을 살펴보면, 동일한 방식으로 시작하는 것을 볼 수 있습니다.
이제 FastImage가 JPEG를 어떻게 감지하는지 살펴보면, 여기서 확인할 수 있습니다:
그러나 필요한 모든 바이트가 존재하지 않으므로 이미지 정보를 추출할 수 없습니다.
Discourse에서 이 문제를 어떻게 수정할 수 있을까요?
FastImage 코드를 살펴보면, 전달할 수 있는 유용한 옵션이 하나 있습니다.
이 옵션을 사용하면 모든 오류(SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI)에서 이미지 정보가 반환되지 않으며, 파일이 이미지로 감지되지 않습니다.
@image_info =
begin
FastImage.new(@file, :raise_on_failure=>true)
rescue StandardError
nil
end
...
is_image ||= @image_info && FileHelper.is_supported_image?("test.#{@image_info.type}")
그런 다음, 이제 작동합니다:
나중에 PR을 만들 수 있습니다. 이 옵션을 사용하는 것이 여기서는 합리적입니다. 