Jngai1297 Jngai1297 - 2 months ago 7
Ruby Question

batch jpg images in string blob not all written to file with ruby file open write barby gem rmagick

I am using barby gem to generate barcodes. I am doing it a batch at a time and then save all of them in a file to be viewed by the user. I am not trying to print one at a time.

def generate_barcode
number_of_instances = params[:times].to_i
value = 12.times.map{rand(10)}.join

barcodes = 10.times.collect { Barby::EAN13.new(value) } #collects ten barcodes in an array
processed_barcodes = barcodes.map {|barcode| barcode.to_jpg_2(:height => 60)} #returns an array and each element is a string of jpeg file
File.open('code.jpg', 'wb') do |f|
processed_barcodes.each {|barcode| f.write(barcode)} #stuck here
#f.puts(processed_barcodes) #tried this
end

send_file('code.jpg',
:type => 'image/jpeg',
:disposition => 'inline'
)

end


the view

<%= image_tag(url_for({:controller => 'business_partners', :action => 'generate_barcode', :format => 'jpg' })) %>


processed_barcodes.count
came back with 10.

My code.jpg got processed but I only have 1 image.

each image in jpg string blob format looks like this

>> processed_barcodes.first
=> "\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xFF\xDB\x00C\x00\x03\x02\x02\x02\x02\x02\x03\x02\x02\x02\x03\x03\x03\x03\x04\x06\x04\x04\x04\x04\x04\b\x06\x06\x05\x06\t\b\n\n\t\b\t\t\n\f\x0F\f\n\v\x0E\v\t\t\r\x11\r\x0E\x0F\x10\x10\x11\x10\n\f\x12\x13\x12\x10\x13\x0F\x10\x10\x10\xFF\xC0\x00\v\b\x00P\x00s\x01\x01\x11\x00\xFF\xC4\x00\e\x00\x01\x01\x01\x01\x01\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\a\b\x06\x05\x02\x03\t\xFF\xC4\x009\x10\x00\x00\x05\x03\x01\x05\x05\x03\f\x03\x01\x00\x00\x00\x00\x00\x01\x02\x03\x04\x06\x00\x05\a\b\x11\x12\x13\x14w\"79\xB6\xB7\x158\x87\t\x16\x18!#3FI\x85\xB5\xC4\xC5\x17$B%\xFF\xDA\x00\b\x01\x01\x00\x00?\x00\xFDS\xA5)JR\x94\xA5)JR\x95\x8F\xF2\xA6{\xCB\x11\xB9\xA6q\xB4\xD9e|\xBBH|>mt\xB2\xA7\xC8\xB6?*\xE9\x85\x82&\xED\xA2\x9BL\x98\x89\xF7\x17\xBA\xBF>\xC3\x89\x8An>\xC3\x01\x8AB\x01h\x1A`\xCAS\xBC\x89\xECo\x9E7\xDFhsx~\x01)[\xFDTR\xDE\xBA\\\xBD\xAB\xCE\xAF\xF6d.\xCE'*\x87`;\x05\xDC\xEC\x14\xBBM\xB6\x7F\xA4\xAC\xF7\x962l\xD25i\x9CJ\xFD\xA4\xD2\xE1\x0FR\xE8\xE1>E\xB2;\xEE\x82\xC1\tv\nmI2\x88}\xBD\xEA\xE6}\x80 _\xF66l\xDDM0$\x02\xC1\xAC\xCDI\xBD\x85\xE8\xAA\xEC\xEB$o\xBB\xCBs\v\xAD\xAEb\xA7\xB1\xD8\a\xB4\xDA\xA3\x7Fl\xD14\xF6\x02\e\x11\xD8\x82\x87&\xD4@\x86\x1D\xBBDD\xC0\x03W\xFCi\x9E\xF2\xC4\x83G9c*\xDD\xE5|\xC4\xA63\x0Fmt\xB5\xBF\xE4[\x13\x97tx5\xA6\xE8e8eL\x13>\xD7\xAE\xDC+\xB0\xC5\x12\xF6\xF76n\x14\xA5\b\x064\xD6f\xA4\xE4\x1A\xC6\xCB\x18\xAA\xEF\x929\x88\xB4f`\xDA\xD7ka\xECv\x04\xE5\xDA\x9Esi\xB5\x99>!P\x05\x0F\xB5\x93\xB7\tm1\x84\xDD\xBD\xFD\xBB\xE5)\x82\xFF\x00\xA4\xAC\xF7\x962l\xD25i\x9CJ\xFD\xA4\xD2\xE1\x0FR\xE8\xE1>E\xB2;\xEE\x82\xC1\tv\nmI2\x88}\xBD\xEA\xE6}\x80 _\xF66l\xDDM0\"!\x9E\xF2\xC5\xD2\x17\x15\xBB>\x95\xF1]\xDC\xA1\xF8R\xE8\xE9NE\xB1x\x8E\xAF\xD7\xF5\x9A]\x94\xD8\t\x80\a\x1D\x02\x14\x9B\x00\x00\xA9\xEC\xDA\x98\x10\xDF]p\x1A\x90\xD5\x1Ev\x81}1>i\xCEy\x1F\xF1_\xF8\xFB\xE6\x97\xFEc5}\x9B\xED>\x0F;\xF7\x89\e\x8D\xC4\xDF7\xDE\xEF\xEE\xED\xECn\xD25\xAA<\xEDp\xD7\xD68\xC2\x8E\xE7<He\xFB\xE7\xAF\xB4-\x9E\xCCf\x1CnB\xF5&l\xD3\xED\x81.)w\x11\xB6\xB2/d\xE1\xBD\xC1\xDAm\xE19\xC4\xDD\xFEK\xCFyb?\xA3\x9CO\x95m\x12\xBE^S&\x87\xB9\xBA]\x1F\xF2-\x8F\xCC:$\x1A\xEDt*\x9C3&)\x93c\xD6\x8D\xD5\xD8R\x81{\e\x9B7\fb\x8F\x01\x85uG\x9D\xA5\xB8_\x01K$3\x9En\xEB5\xE7=\xBA\xE3\xD9\x8C\xD3\xE6\xF8s\xE8\xFD\xA8\x9D\x92$\x05Oc\x17\xEE\xD1\xEC\x01~\xF7|{e!\xCB\xAF\xF4\xF5)\xBE\xCEp\x164\x9A\xCA_s\xB7\xA9\x04>\xCDt\xB8\xB9\xE1\x11>;\xA5\xD9$\xA2\xAAn\x10\nB\xEF\x1C\xE6\x1D\x85\x00(m\xD8\x00\x01\xF5U\x02\x95\x803\x87x\xBA\x97\xE9\xFEH\xF2\xAC\x16\xAA\xBA+\xFC=\xD0\fY\xFD\xE5J\xB4\e\xDE,;\xA7\xEA\xF9W\e\xD6U\x8Bwu\xF2qu\x02\xF9\xE6\xA6u\xAA\xB0\xDF\x87\xBEv\xE9\xFB?L\xEC5\x95p\xDF\x88Fv\xEA\x03?S,5\xAA\xB4\e\xDE,;\xA7\xEA\xF9W\e\xD2\x03\xDD\xD4\e\xA7\xFAq\xF3S\x8A\x95j\xFF\x00\xF3\x05\xF8Q\xFCzC|Sq\x0F\xC4\x7F1\xCC\xAA\xAB\x99<=\xF0OO\xDEzg~\xA9V\x9C}\xDDt\xB1\xFA\x8F\xAAqZ\xDF\xFAN\xF7X\xC3}?\x8F~\xDC\x85UiX\x038w\x8B\xA9~\x9F\xE4\x8F*\xC1j\xAB\xA2\xBF\xC3\xDD\x00\xC5\x9F\xDET\xABA\xBD\xE2\xC3\xBA~\xAF\x95q\xBDeX\xB7w_'\x17P/\x9EjgZ\xAB\r\xF8{\xE7n\x9F\xB3\xF4\xCE\xC3YW\r\xF8\x84gn\xA03\xF52\xC3Z\xABA\xBD\xE2\xC3\xBA~\xAF\x95q\xBD =\xDDA\xBA\x7F\xA7\x1F58\xA9V\xAF\xFF\x000_\x85\x1F\xC7\xA47\xC57\x10\xFCG\xF3\x1C\xCA\xAA\xB9\x93\xC3\xDF\x04\xF4\xFD\xE7\xA6w\xEA\x95i\xC7\xDD\xD7K\x1F\xA8\xFA\xA7\x15\xAD\xFF\x00\xA4\xEFu\x8C7\xD3\xF8\xF7\xED\xC8UV\x95\x803\x87x\xBA\x97\xE9\xFEH\xF2\xAC\x16\xAA\xBA+\xFC=\xD0\fY\xFD\xE5J\xB4\e\xDE,;\xA7\xEA\xF9W\e\xD6U\x8Bwu\xF2qu\x02\xF9\xE6\xA6u\xAA\xB0\xDF\x87\xBEv\xE9\xFB?L\xEC5\x95p\xDF\x88Fv\xEA\x03?S,5\xAA\xB4\e\xDE,;\xA7\xEA\xF9W\e\xD2\x03\xDD\xD4\e\xA7\xFAq\xF3S\x8A\x95j\xFF\x00\xF3\x05\xF8Q\xFCzC|Sq\x0F\xC4\x7F1\xCC\xAA\xAB\x99<=\xF0OO\xDEzg~\xA9V\x9C}\xDDt\xB1\xFA\x8F\xAAqZ\xDF\xFAN\xF7X\xC3}?

Answer

You open one file using File.open('code.jpg', 'wb') and write into it processed_barcodes times. If you want processed_barcodes files then you need to loop around File.open with unique names.

Instead of:

File.open('code.jpg', 'wb') do |f| 
  processed_barcodes.each {|barcode| f.write(barcode)} #stuck here
  #f.puts(processed_barcodes) #tried this
end

Use this untested code:

processed_barcodes.each_with_index do |barcode, i|
  File.open("code_#{i + 1}.jpg", 'wb') do |f| 
    f.write(barcode)
  end
end

You'll need to figure out how to modify:

send_file('code.jpg',
  :type        => 'image/jpeg',
  :disposition => 'inline'
)