質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

[Milkcocoa] send() メソッドのデータ量上限はいくつでしょうか?

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,684
退会済みユーザー

退会済みユーザー

現在、Milkcocoaにて任意の画像データをsend()にて送りたいと思っております。

send()によるデータの通信はできているのですが、画像データ(base64形式, blob形式)をオブジェクトで
送信しようとした際、データ量が大きくて通信されていないようなのです。
(画像データ量を小さくしていくと、ある境で送ることができました。)

ここで質問なのですが
send()メソッドによるデータ量の上限はいくつなのでしょうか?
ドキュメントを確認した中には、push()メソッド項目に
『1回にpushできる最大サイズは16Kbyte』
と書かれていたのですが、これはpush()メソッドに関わらず
send()にも関係することなのでしょうか?

もしかしたらドキュメントに書かれているのを見落としているだけなのかもしれないですが
ご回答していただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

無料版の管理コンソールで、確か16kbっていうのを見た記憶があります。
パケット送信回数制限が300/日だったと思うので、2mbのファイルを14kbに分割して送信したらパケット制限にひっかかるのかまでは未確認です。
------- 検証結果 -----------
base64 変換後のイメージサイズ:12000 bytes

milkcocoa に post したデータ
            this._ds.push({
                "title": title,
                "dataType": dataType,
                "imageData": imageData,
                "message": message,
                "date": new Date().getTime()

imagedata は、img タグそのものに変換済みで、
結局、imageData の送信データサイズが 4000 バイトで送信失敗、
3500 バイトで 送信成功、受信成功ということから、push のデータサイズは合計 4KB 以内って感じです。
3500 のときの、message="じゃんけん画像送信テスト" です。
JSON.stringify() 後のデータサイズが 4KB 未満にしないとまずそうです。
分割で送信するとあっという間に転送パケット制限に引っかかりますね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/12 12:40

    ご回答ありがとうございます!
    4KBの回答をいただいた後、こちらでも適当に3〜4KBで確認いたしました!

    4KBの制限は画像ではなかなか厳しいようですが、今やろうとしていることに関しては
    十分に足りそうですので、試行錯誤がんばります!

    ありがとうございました!

    キャンセル

0

var yourAppId = "????????";

function MilkcocoaUtil(dataStore, renderCallback) {
    return new MilkcocoaUtil.prototype.init(dataStore, renderCallback);
}

MilkcocoaUtil.prototype = {
    dataStore: null,
    render: null,
    _ds: null,
    _queueMap: {},
    init: function(dataStore, renderCallbackFn) {

        console.log("MilkcocoaUtil init start.");
        //0.set callback
        this.render = renderCallbackFn;
        this.dataStore = dataStore;

        //1.ミルクココアインスタンスを作成
        //var milkcocoa = new MilkCocoa("{your-app-id}.mlkcca.com");
        var milkcocoa = MilkCocoa.connectWithApiKey(yourAppId + ".mlkcca.com", "**********", "**************************");

        //2."message"データストアを作成
        this._ds = milkcocoa.dataStore(this.dataStore);

        //3."message"データストアからメッセージを取ってくる
        var self = this;
        this._ds.stream().sort("desc").next(function(err, datas) {
            datas.forEach(function(data) {
                // queue の課題: 投稿順序れ崩れる、html にマーカー(ローディング中)を差し込んでおく必要がある。
                data = self.queue(data);
                if (data != null)
                    self.render.apply(self, [data]);
            });
        });

        //4."message"データストアのプッシュイベントを監視
        this._ds.on("push", function(eData) {
            // queue の課題: 投稿順序れ崩れる、html にマーカー(ローディング中)を差し込んでおく必要がある。
            eData = self.queue(eData);
            if (eData != null)
                self.render.apply(self, [eData]);
        });
        console.log("MilkcocoaUtil init success.");
    },
    queue: function(data) {

        console.log("queue: " + JSON.stringify(data));

        // data.value.kind = SPL or RAW を判定して、受信データを振り分ける
        if (data.value.kind == "SPL") {
            var splitId = data.value.id;
            if (!(splitId in this._queueMap)) {
                this._queueMap[splitId] = [];
            }
            this._queueMap[splitId].push(data.value);
            if (this._queueMap[splitId].length == data.value.size) {
                this._queueMap[splitId].sort(function(a, b) {
                    return a.index - b.index;
                });

                var stringifiedJson = "";
                this._queueMap[splitId].forEach(function(v, i, s) {

                    stringifiedJson += v.data;

                });

                data.value = JSON.parse(stringifiedJson);

                return data;
            }
            return null;
        } else if (data.value.kind == "RAW") {
            return data;
        } else {
            return data;
        }
    },
    post: function(title, dataType, imageData, message) {

        var self = this;

        if (!!dataType && !!message) {

            var sendData = {
                "kind": "RAW",
                "title": title,
                "dataType": dataType,
                "imageData": imageData,
                "message": message,
                "date": new Date().getTime()
            };

            var DS_LIMIT = 3500;
            // JSON データ変換後のデータサイズが 3800 バイト以上の時、データを分割して送信する
            // 4000 で送信失敗、+200 は、分割データの JSON.stringify に付くクオートとかの分
            var stringifiedJson = JSON.stringify(sendData);

            if (stringifiedJson.length <= DS_LIMIT) {
                // 送信データ限界までならそのまま送信
                self._ds.push(sendData, function (e) {});
            } else {
                // 限界オーバーなら分割送信
                var splitArr = [];
                var uniqueId = "SPLIT" + (new Date()).getTime();
                while (stringifiedJson.length > DS_LIMIT) {
                    splitArr.push({
                        kind: "SPL",
                        size: 0,
                        index: 0,
                        id: uniqueId,
                        data: stringifiedJson.substring(0, DS_LIMIT)
                    });
                    stringifiedJson = stringifiedJson.substring(DS_LIMIT);
                }
                if (stringifiedJson.length > 0) {
                    splitArr.push({
                        kind: "SPL",
                        size: 0,
                        index: 0,
                        id: uniqueId,
                        data: stringifiedJson
                    });
                }
                splitArr.forEach(function(data, index, splitArrSelf) {
                    data.size = splitArrSelf.length;
                    data.index = index + 1;
                    console.log("分割送信:" + data.index + "/" + data.size);
                    self._ds.push(data, function (e) {});
                });
            }
        }
    },
    escapeHTML: function(val) {
        //インジェクション対策
        return $('<div>').text(val).html();
    }
};

MilkcocoaUtil.prototype.init.prototype = MilkcocoaUtil.prototype;


function mcRenderMessage(message) {

    var last_message = "dummy";
    // message = {
    //    id: " unique id created by 'milkcocoa's server engine'"
    //    value: {
    //       "title": title,
    //       "dataType": dataType,
    //       "imageData": imageData,
    //       "message": message,
    //       "date": new Date().getTime()
    //    }
    // };
    //
    var m = message.value;
    var div = $("<div />");
    div.append("<p>" + m.message + "</p>");
    div.append("<p>" + new Date(m.date).toLocaleString()+"</p>");
    div.append("<img src='" + m.imageData + "' />");

    $("#"+last_message).before('<div id="'+message.id+'" class="post">'+ div.html() +'</div>');
    last_message = message.id;
}
使い方
<script>
$(function() {

    var last_message = "dummy";
    var mc = MilkcocoaUtil("imageTestDs", function(message) {
        // message = {
        //    id: " unique id created by 'milkcocoa's server engine'"
        //    value: {
        //       "title": title,
        //       "dataType": dataType,
        //       "imageData": imageData,
        //       "message": message,
        //       "date": new Date().getTime()
        //    }
        // };
        //
        var m = message.value;

        var div = $("<div />");
        div.append("<p>" + m.message + "</p>");
        div.append("<p>" + new Date(m.date).toLocaleString()+"</p>");
        div.append(m.imageData);

        $("#"+last_message).before('<div id="'+message.id+'" class="post">'+ div.html() +'</div>');
        last_message = message.id;

    });

    var counter = 1;
    $("#clickMe").click(function(e) {
        $.ajax({
            url: "jsp/loadimage.jsp",
            unique:false,
            complete: function(xhr) {
                var data = xhr.responseText;
                // title, dataType, imageData, message
                console.log("ajax request recieved: " + data.substring(0,50));
                console.log("ajax request recieved size: " + data.length + " bytes.");
                mc.post("じゃんけんの画像", "image/png", data, "じゃんけん画像送信テスト" + counter++ + " 回目");
                //.substring(0, 3500)
            }
        });
    });
});
</script>


Java1.8 TOMCAT8 EclinpseLuna 動的Webプロジェクト
3500 - 4000 バイトが肝。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる