0


私はdojo1.7に取り組んでいます。私は ajax return から取得しているマルチパート応答を解析したいと考えています。
どうやってするの?誰かが私に提案できますか?
前もって感謝します!

4

1 に答える 1

1

Dojo がネイティブでこれを行うとは思いません。クライアントでマルチパートを処理するのは異常です。multipart-mime 用に独自の XHR ハンドラを作成する必要があります。

マルチパート形式は、 Contact-Type見出しで指定された境界でコンテンツを分割します。

eg.
Content-Type: multipart/form-data; boundary=AaB03x

JavaScriptで単純なstring.split(<regx>)を使用して、これらの部分を分割できます。次に、個々のパーツを解析する必要があります。各パーツには独自のヘッダー セットがあり、コンテンツは Content-Type の形式に従ってエンコードされます。

添付ファイルを受信して​​いる場合は、base64 エンコーディングが使用されている可能性があります。したがって、デコードする必要もあります。

標準の xhr 呼び出しで独自のハンドラーを使用するには (ロードしたら)。

require(["dojo/_base/xhr", "mylib/multipart"], function(xhr){
    xhr.get({
            "url": "<URL TO MULIPART DATA>",
            "handleAs": "multipart",
            "preventCache": true,
            load: function(data){
                // Do something with the multipart data
            }
    });
});

ここでは、「mylib/multipart」からロードされた「multipart」と呼ばれるユーザー定義のハンドラーを使用しました。Dojo では、任意の数のハンドラーを作成し、それらをロードして、スクリプトで受信したデータを解析できます。

注意:ブラウザーのセキュリティにより、データを読み込むページと同じ URL にある場合にのみ、XHR 経由でデータを読み込むことができます。(参照: Stackoverflow の会話)。

以下に、マルチパート ハンドラーの例を作成しました。

require([
    "dojo/_base/xhr",
    "dojo/_base/array",
    "dojo/_base/lang"
], function(xhr, array, lang){
    lang.mixin(xhr.contentHandlers, {
        "multipart": function(response){
            var parser = {
                parse: function(response){
                    var parts = new Array();
                    var boundary = parser._getBoundary(response);
                    if(boundary){
                        parts =  parser._getParts(
                            response.responseText,
                            boundary
                        );
                    }
                    return parts;  // return empty array if parsing could not be done
                },

                _getBoundary: function(response){
                    var contentType = response.getResponseHeader("Content-Type");
                    if(/boundary\=/.test(contentType)){
                        var parse = /boundary\=(.*?)(;|$)/.exec(contentType);
                        return parse[1];
                    }
                    return false;  // Return false if no boundary found
                },

                _getParts: function(text, boundary){
                    var parsed = new Array();
                    var splitter =new RegExp(boundary+"[\r\n]+","g");
                    var parts = text.split(splitter);  // Split at the boundary

                    array.forEach(parts, function(part){
                        var headBody = part.split("\n\n");
                        if(headBody.length > 0){
                            var head = lang.trim(headBody[0]);
                            var body = headBody[1];
                            if(head != ""){  // Don't parse if no header, probably an error
                                parsed.push({
                                    "head": parser._parseHeaders(head),
                                    "body":body
                                });
                            }
                        }
                    }, this);

                    return parsed;
                },

                _parseHeaders: function(headerText){
                    // Headers should be in format: Header: Value
                    var header = {};
                    var lines = headerText.split(/[\r\n]/);
                    array.forEach(lines, function(line){
                        var parts = line.split(":");
                        if(parts.length > 0){
                            header[lang.trim(parts[0])] = lang.trim(parts[1]);
                        }
                    }, this);
                    return header;
                }
            };

            return parser.parse(response);
        }
    });
});

これにより、Xhr から返されたテキストがコンテンツ オブジェクトの配列に解析されます。各コンテンツ オブジェクトには、生テキストの本文を含むbody属性と、そのヘッダーのオブジェクトを含むhead属性が含まれている必要があります。

プレーン テキストでない場合は、生のコンテンツを処理するために追加のコードを記述する必要があります。また、すべての状況で機能することを確認するために、多くのテスト データを投入することもできます。

于 2012-11-14T15:38:04.250 に答える