0

以下のように 2 つの BASE64 文字列を JSON で送信して、ドキュメントの添付ファイルに割り当てたいと考えています。

curl -X POST \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{"document":{"image_data":["some_base64_string_1", "some_base64_string_2"], "note":"Some note"}}' \
http://myap.dev/api/v1/documents.json

class Document < ActiveRecord::Base
  attr_accessor :image_data

  belongs_to :user
  has_many :attachments

  before_save :decode_image_data

  def decode_image_data
    if self.image_data.present?     
        # here I want to get image_data and create two attachments
        # image_data is right now nil
     end
  end
end

私の JSON はどのように見えるべきですか?

4

1 に答える 1

0

Base64 は厄介者 (議論を混乱させる可能性があるもの) であるため、それについては少し脇に置きましょう。

JSON は配列を表すことができるので、ここから始めます。何かの 2 つが必要だからです。JavaScript とブラウザーが行うことを行うふりをするのは簡単です。

require 'json'

ary = ['content for box one', 'content for box two']
puts JSON[ary]
# >> ["content for box one","content for box two"]

この時点で、2 つの ASCII 文字列を含む配列に対して JavaScript が作成するのと同じ種類のベース文字列ができました。テストのこの部分では、ASCII かバイナリかは重要ではありません。

JSON は、配列内の文字列の内容だけを残していることに注意してください。これらの文字列内で BASE64 エンコーディングを使用でき、JSON がそれをそのままにしておくことがわかります。

puts JSON[ ary.map{ |s| Base64.encode64(s) } ]
# >> ["Y29udGVudCBmb3IgYm94IG9uZQ==\n","Y29udGVudCBmb3IgYm94IHR3bw==\n"]

これは、Rails で逆のプロセスを実行する前に受け取りたい JSON 文字列の種類を示しています。

さらに混乱させるために、それを変数に割り当てます(ブラウザから受信したかのように):

incoming_json = JSON[ary.map{ |s| Base64.encode64(s) } ]
incoming_json
# => "[\"Y29udGVudCBmb3IgYm94IG9uZQ==\\n\",\"Y29udGVudCBmb3IgYm94IHR3bw==\\n\"]"

Pretendincoming_jsonは、Rails が受け取る JSON です。これを に渡してJSON[]デコードすると、受信文字列が BASE64 でエンコードされた文字列の配列に返されます。これが受信コンテンツになります。それらを BASE64 からデコードすると、送信されたものの配列が得られます。

JSON[incoming_json].map{ |s| Base64.decode64(s) } 
# => ["content for box one", "content for box two"]

これは、2 つの「バイナリ」ストリームの往復のエンコードとデコードです。それが ASCII テキストであるかバイナリ データのストリームであるかは BASE64 にとって重要ではなく、JSON も気にしません。なぜなら、Ruby 配列を作成するためにラッパーを元に戻すことだけに関係するからです。これらの配列要素の内部にあるものは、JSON ではなく、何か別の問題になります。そのため、「ラップされていない」配列を に渡しmap、要素を操作できるようにします。

于 2013-09-11T14:15:51.983 に答える