字符串 blob 中的批处理 jpg 图像未全部写入文件 ruby file open write barby gem rmagick

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

我正在使用 barby gem 生成条形码。我一次做一批,然后将它们全部保存在一个文件中,以供用户查看。我不想一次打印一个。

  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

风景

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

processed_barcodes.count 回来了 10。

我的 code.jpg 已处理,但我只有 1 张图像。

jpg 字符串 blob 格式的每张图片如下所示

>> 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\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}?

您使用 File.open('code.jpg', 'wb') 打开一个文件并向其中写入 processed_barcodes 次。如果你想要 processed_barcodes 个文件,那么你需要使用唯一的名称循环 File.open

而不是:

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

使用这个未经测试的代码:

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

您需要了解如何修改:

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