기본적으로 메모리에서 tar/gz 형식으로 데이터를 스트리밍하고 싶습니다 (아마도 여러 파일을 타르에 넣으 려하지 않지만 HARDDRIVE에는 절대 스트리밍하지 않아야합니다!). 그런 다음 다른 곳으로 스트리밍합니다 (HTTP 요청 본문).루비 스트리밍 tar/gz
누구든지이 작업을 수행 할 수있는 기존 라이브러리에 대해 알고 계십니까? Rails에 뭔가가 있습니까?
libarchive-ruby은 C 래퍼이며 매우 플랫폼에 종속적 인 것처럼 보입니다 (문서는 설치 단계로 컴파일해야합니까?).
해결책 : 그것은
require 'zlib'
require 'rubygems/package'
tar = StringIO.new
Gem::Package::TarWriter.new(tar) { |writer|
writer.add_file("a_file.txt", 0644) { |f|
(1..1000).each { |i|
f.write("some text\n")
}
}
writer.add_file("another_file.txt", 0644) { |f|
f.write("some more text\n")
}
}
tar.seek(0)
gz = Zlib::GzipWriter.new(File.new('this_is_a_tar_gz.tar.gz', 'wb')) # Make sure you use 'wb' for binary write!
gz.write(tar.read)
tar.close
gz.close
입니다! GzipWriter에있는 파일을 스트리밍 상태로 유지하려면 IO로 스왑 할 수 있습니다. dw11wtq의 쿠키!
또한 이것은 실제로 메모리를 많이 사용한다는 점을 지적해야합니다. gzip 스트림으로 이동하기 전에 StringIO를 전체 타르로 채 웁니다. 큰 파일에 대한 더 나은 솔루션은 스트림 사이에 버퍼를 만드는 것입니다. 그것을 구현할 때이 코드를 추가 할 것입니다 ... –
gz.close 또한 출력 IO (이 경우 File)를 닫습니다. 열린 상태로 유지하려면 gz.finish를 사용하십시오 –