2014-01-23 3 views
1

Ruby에서 PNG를 문자열 형식 (아래처럼)으로 파싱하려면 어떻게해야합니까?PNG 문자열을 Ruby 파일로 구문 분석

\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x01,\x00\x00\ 

자세한 내용을 추가하면 의견에 남겨졌습니다.

파일 시스템에 PNG가있는 경우 File.open으로 파일을 열 수 있습니다. File.open이 생성하는 동일한 객체를 원하지만 파일 시스템이 아닌 문자열에서 생성해야합니다.

궁극적으로 이것을 Paperclip 첨부 파일에 지정하고 개체를 png로 인식하려고합니다.

+2

구문 분석? 파일에? 그게 무슨 소리 니? –

+0

PNG가 파일 시스템에 존재하면 File.open으로 파일을 열 수 있습니다. File.open이 생성하는 동일한 객체를 원하지만 파일 시스템이 아닌 문자열에서 생성해야합니다. – ckarbass

답변

3

FileIO 단지 구현입니다. Ruby에는 이라는 문자열을 읽고 쓸 수있는 다른 IO 구현이 있습니다.

file = StringIO.new("\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x01,\x00\x00\") 

귀하의 의견은 paperclip과 함께 사용하는 것이 좋습니다. 이 경우 paperclip은 보통 (버전에 따라 다름) 파일 이름과 MIME 유형을 원하기 때문에 파일을 첨부 파일 속성에 지정하기 전에 추가하십시오.

file.content_type = "image/png" 
file.original_filename = "image.png" 
object.attachment = file 

위의 내용은 가장 최근의 클립에 적용됩니다. 임시 파일에 쓰는 것보다 훨씬 낫습니다.

+2

분명히? 그것은 뒤늦은 지경에서만 분명합니다. :) –

+0

동의, 이것은 tempfile보다 좋습니다 :) –

2

당신은 StringIO을 사용할 수 있습니다 : (당신이 실제 파일 객체를 원하는 경우)

s = "\x89PNG\r\n..." 
file = StringIO.new(s) 

다른 방법으로, Tempfile를 사용할 수 있습니다

require 'tempfile' 

file = Tempfile.new('png') 
file.write "\x89PNG\r\n..." 
file.rewind # move position pointer to the beginning of the file 
+0

이 방법으로 클립 클립 첨부를 설정하면 텍스트 파일로 저장되지만 이미지로 렌더링됩니다. 어쩌면 그것은 텍스트 클립이라고 가정 한 클립 일 뿐이며 StringIO 객체입니다. – ckarbass

+0

글쎄, 당신은 문자열을 저장하고 있습니다. 클립 클립이 당신의 마음을 읽을 것으로 기대 했습니까? 어쨌든, 범위를 벗어났습니다. 다른 질문을해도 좋습니다. –

+0

나는 마음이 읽기를 기대하지 않았다. 필자가 원했던 동작은 디스크에서 png 파일을 연 경우와 동일한 동작 이었으므로 범위 내에 있음을 확신 할 수 있습니다. 디스크에서 png를 열면 문자열이 아닐까요? – ckarbass