私はdojo1.7に取り組んでいます。私は ajax return から取得しているマルチパート応答を解析したいと考えています。
どうやってするの?誰かが私に提案できますか?
前もって感謝します!
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属性が含まれている必要があります。
プレーン テキストでない場合は、生のコンテンツを処理するために追加のコードを記述する必要があります。また、すべての状況で機能することを確認するために、多くのテスト データを投入することもできます。