[Rails] null byte 오류 발생 시 대응

5474 단어 RailsRubytech

하고 싶은 일


① S3에서 여러 Zip 파일 가져오기
② 여러 zip 파일을 디렉토리로 동결해제
③ 최종적으로 zip 파일을 만들고 싶다.

발생한 문제


①get으로Object를 통과한 결과 ②에서 필요한 파일 경로를 얻을 수 없는 상황은 다음과 같다.PK\u0003\u0004\u0014\u0000\u0000\u0000\u0000\u0000\xA1\x9AYQ\u0000\u0000\u0000
client = Aws::S3::Client.new(
	:region => 'ap-northeast-1',
	:access_key_id => '***',
	:secret_access_key => '***',
)      
@orders.each do |order|
	obj = client.get_object(
	bucket: "*",
	key: order.zip_file_name
	).body.read  
    
	Rails.logger.debug obj.inspect
    #=> PK\u0003\u0004\u0014\u0000\u00....
end

까닭


zip 파일의 내용은 이진 데이터입니다.
다운로드한 파일의 내용을 obj를 참조합니다.함수.body.read는 zip 파일의 내용을 참고하는 함수입니다.따라서 당연히 로그에 이진법이 나온다.

해결책


read를 사용하지 않고 루비zipopen_buffer 방법으로 zip 파일을 엽니다.
다만, 오픈rubyzip의 공식 문서에 버퍼 방법이 없습니다...
나는 더 좋은 방법을 찾고 싶다.
client = Aws::S3::Client.new(
	:region => 'ap-northeast-1',
	:access_key_id => '***',
	:secret_access_key => '***',
)      
@orders.each do |order|
	obj = client.get_object(
	bucket: "*",
	key: order.zip_file_name
	).body  >> readしない!    
end

# get_objectでopenする
Zip::File.open_buffer(obj) do |zip|
	~~
end

좋은 웹페이지 즐겨찾기