Batik トランスコーディングで SQL テーブルから取得した SVG コードを使用しようとすると、「3 バイト UTF-8 シーケンスのバイト 2 が無効です」というエラーが表示されます。
jQuery によって DOM からプルされた svg 描画は、jQuery Ajax を介して cfc に送信され、SQL テーブルに更新されます。別の別のページで、SVG コードがテーブルからクエリされ、Batik を使用して PNG ファイルにトランスコードしようとします。その時点で、無効な UTF-8 シーケンス エラーが発生します。
データを保存するコード:
var lclSVG = $('#holderDiv')[0].innerHTML;
$.ajax({
type: "POST",
url: "dbNIS.cfc?method=saveSketch",
data: ({orderID: ordID, sketch_svg: lclSVG}),
dataType: "json",
success: function(saveData) {alert(saveData.CODE);}
});
SVG コードがテーブルに保存される CFC からのコード:
<cffunction name="saveSketch" access="remote" output="no" returntype="struct" returnFormat="JSON">
<cfargument name="orderID" type="string" default="" required="Yes" hint="Order ID">
<cfargument name="sketch_svg" type="string" default="" required="Yes" hint="Sketch SVG Data">
<CFQUERY NAME="updateSketch">
UPDATE sketch
SET sketch_svg = '#arguments.sketch_svg#'
WHERE ordID = #arguments.orderID#
</CFQUERY>
</cffunction>
SVG がテーブルから取得され、PNG へのトランスコードに使用されるコード:
<CFQUERY NAME="getSketch">
SELECT sketch_svg AS svg
FROM sketch
WHERE ordID = 1
</CFQUERY>
<cfscript>
transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
inputStream = createObject("java", "java.io.StringBufferInputStream").init(getSketch.svg);
input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(inputStream);
OutFile = expandPath("myTest.png");
outputStream=CreateObject("java", "java.io.FileOutputStream").init(OutFile);
output=CreateObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(outputStream);
transcoder.transcode(input, output);
outputStream.close();
</cfscript>
注:代わりに、svg をアクション ページに送信して、テーブルに更新し、すぐにそのテーブルから取得してから、正常に機能するトランスコードを試みました。したがって、ajaxを介して送信するとき、またはテーブルから更新/取得するときに、文字セットに何か問題があるに違いないように思えます。できれば助けてください...
もう少し絞ってきました。テーブルに直接svgを入力すると、3番目のセクションが正常に機能します...したがって、svgがcfcに送信されてテーブルに保存されるajax呼び出しでデータが送信される方法に問題があるに違いありません.