2017-05-03 13 views
10

저는 Ruby 2.4와 Rails 5를 사용하고 있습니다. "content"라는 이름의 variabe에 파일 콘텐츠가 있습니다. 콘텐츠에는 PDF 파일, Word 파일 또는 HTML 파일과 같은 데이터가 포함될 수 있습니다. 변수에 바이너리 데이터가 있는지 알려주는 방법이 있습니까? 궁극적으로, 이것이 PDf, Microsoft Office 또는 다른 유형의 OpenOffice 파일인지 알고 싶습니다. 이 답변 - Rails: possible to check if a string is binary?는 - 그러나, 나는 거기에 나타났습니다, 나는 변수Ruby 변수에 바이너리 데이터가 있는지 확인하는 방법이 있습니까?

content.encoding 

의 인코딩을 확인 할 수 있으며 이진 데이터의 경우

ASCII-8BIT 

을 생산할 것이라고 제안 변수에 저장된 HTML 컨텐트가 "ASCII-8BIT"를 content.encoding으로 반환 할 수 있으므로 "content.encoding"을 사용하면 바이너리 데이터가 있는지 알려주는 간단한 방법이 아닙니다. 그런 식으로 존재 하는가? 그렇다면 무엇입니까?

+0

귀하의 요구 사항을 감안할 때, ave는 내용의 약간 분석을한다. 상위 n 바이트를 가져 와서 표준 ASCII 코드와 비교해 보겠습니다. 대다수의 문자가 ASCII가 아닐 경우 콘텐츠가 이진 파일 일 가능성이 높습니다. 카이 제곱 테스트처럼 잘 맞는 것 같습니다. 실제 파일 객체에 액세스 할 수없는 이유는 무엇입니까? – Brennan

+0

파일에 대한 추가 정보가없는 데이터베이스의 콘텐츠에 액세스하고 있습니다. 때로는 파일 이름이 있지만 확장자는 파일/내용 유형을 결정할 때 신뢰할 수 없습니다. – Dave

+0

잠깐, 파일 내용이 DB에 있습니까? – Brennan

답변

4

실제 질문이 이진 데이터 그 자체가 아니라의 파일 유형을 결정하는 인 경우이 정보를 훨씬 더 안정적으로 제공하는 ruby-filemagic gem을 살펴볼 것을 권장합니다. 이 젬은 유닉스 계열 시스템의 표준 인 libmagic 라이브러리를 감싸는 단순한 래퍼입니다. 라이브러리는 파일의 내용을 스캔하고 다양한 파일 유형의 알려진 "마법"패턴 세트와 대조하여 작동합니다. 문자열 버퍼

샘플 사용 (예를 들어, 데이터가 데이터베이스를 구성 읽기) :

require "ruby-filemagic" 

content = File.read("/.../sample.pdf") # just an example to get some data 

fm = FileMagic.new 
fm.buffer(content)  
#=> "PDF document, version 1.4" 

보석은 당신이 설치 헤더와 file 유틸리티뿐만 아니라 magic 라이브러리를 필요로 작업 (컴파일) 할 수 귀하의 시스템. 추가 정보에서 인용 :

file titi.pdf 

당신에게 :

The file(1) library and headers are required:

Debian/Ubuntu:: +libmagic-dev+
Fedora/SuSE:: +file-devel+
Gentoo:: +sys-libs/libmagic+
OS X:: brew install libmagic

당신이 유닉스 시스템에 있다면, 당신은 파일 명령을 사용할 수 있습니다 5.

+0

흠, 나는이 보석을 설치하고 설치할 때 빌드 오류가 발생합니다. "-lgnurx ... 아니오, *** 오류 :이 모듈을 컴파일하는 데 필요한 라이브러리가 없습니다.". 나는 그것을 연구하고 돌아와서 당신의 제안을 시도해야 할 것입니다. – Dave

+0

어떤 시스템을 사용하고 계십니까? 멈추는 경우 오류 메시지와 함께 전체 로그를 게시 할 수 있습니까? – BoraMa

+0

귀하의 제안에 따라 "brew install libmagic"을 실행하지 않았습니다. 실행하면 모든 것을 설치할 수 있습니다. 필자가 문서에서 알아낼 수없는 한 가지 질문 - "버퍼"가 항상 일관된 방식으로 파일 유형을 출력합니까? 즉, Excel 문서는 항상 "Microsoft Excel"을 출력하고 PDF 문서는 항상 "PDF"라는 단어를 출력합니까? – Dave

0

레일에서 잘 작동 테스트 그러면 다음과 같이 할 수 있습니다.

require 'open2' 

cmd = 'file -' 
Open3.popen3(cmd) do |stdin, stdout, wait_thr| 
    stdin.write(content) 
    stdin.close 
    puts "file type is:" + stoud.read 
end 
+0

제 제작 환경은 Ubuntu Linux이지만 로컬 환경은 Mac OS X입니다. – Dave