1

$ .ajax()を使用して文字列をColdFusionサーバーに送信し、そこでテーブルに保存しています。後でクエリを実行してそのデータを使用しようとすると、エラーが発生します。「nullで囲まれた例外:3バイトのUTF-8シーケンスの無効なバイト2」。

まず、DOMからSVGを取得し、アクションページに送信します。ただのひもでしょ?

var lclSVG = $('#myDiv')[0].innerHTML; // SVG Code (XML?)
$.ajax({
  url: "myAction.cfm",
  type: "POST",
  data: ({myInfo: lclSVG}),
});

myAction.cfmページで、データをテーブルに更新します。

<CFQUERY NAME="postSVG">
  UPDATE myTable
  SET svg = '#form.myInfo#' 
  WHERE  ID = 1
</CFQUERY>

SVG2PNG.cfm:svgデータをクエリして使用しようとすると、「3バイトUTF-8シーケンスのバイト2が無効です」というエラーが表示されます。エラーは.transcode行で発生します。

<CFQUERY NAME="getSVG">
  SELECT svg
  FROM myTable
  WHERE  ordID = 1
</CFQUERY>
<cfset svg = getSVG.svg>
<cfscript>
  transcoder = createObject("java", "org.apache.batik.transcoder.image.PNGTranscoder").init();
  inputStream = createObject("java", "java.io.StringBufferInputStream").init(svg);
  input = createObject("java", "org.apache.batik.transcoder.TranscoderInput").init(inputStream);
  OutFile = expandPath("myTest2.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>

私はjQueryのajaxメソッドを何回か問題なく使用しました。私はここで何か間違ったことをしているのですが、それをうまく処理できないようです...

4

3 に答える 3

0

いくつかのこと:

  1. SVGをUTF-8互換フィールドに保存していると思いますか?
  2. SVGをDOMから取得した後、投稿する前に、SVGが正しいことを確認できますか?
  3. ColdFusion Administratorで、データソース設定に移動し、[詳細設定を表示]をクリックします。[非ラテン文字用に構成されたデータソースに対して拡張ASCII文字とUnicodeを有効にする]というラベルの付いたボックスがオンになっていることを確認します。
于 2012-11-04T21:32:55.860 に答える
0

私はあなたが使用したフレームワークを使用していませんが、svg変数を設定する行でgetSVGクエリを使用する必要がありますか?

<cfset svg = getSVG.svg>
于 2012-11-04T06:05:28.353 に答える
-1

私はこの問題に取り組み、改善を続け、問題を絞り込みました。私は投稿しましたが、これは私の質問に実際には答えません($ .ajax()の修正ではありません)が、問題は修正されます... jQuery ajax()を使用してsvgコードを渡す代わりに、css-hiddenを作成しましたフォームとiFrameを含むdiv。jQueryコードを使用して、IDとsvgを非表示のdivの入力にロードします。次に、jQueryを使用してそのフォームをiFrameに送信します。バックグラウンドで非常にスムーズに動作します。後でテーブルからSVGをクエリしても、utf-8エラーはスローされません。

それが役立つかもしれない人のためにコードを共有する:

<div id="zeroDiv" style="display:none">
  <form id="svgForm" action="saveSVG.cfm" method="post" target="zeroFrame" accept-charset="utf-8">
    <input name="ordID" id="ordID" type="hidden" value="" />
    <input name="svgCode" id="svgCode" type="hidden" value="" />
  </form>
  <iframe id="zeroFrame" name="zeroFrame" src="" style="width:0;height:0;border:0px solid #fff; display:none"></iframe>
</div>

これは、それを呼び出して送信するjavascript/jQueryです。

var lclSVG = $('#holderDiv')[0].innerHTML;
lclSVG = lclSVG.replace(/&quot;/g,"");
$('#ordID').val(ordID);
$('#svgCode').val(lclSVG);
$('#svgForm').submit();

これは、saveSVG.cfmページのCFコードです。サーバー側の技術なら何でもかまいません...

<cfif isDefined("form.ordID") AND Val(form.ordID) AND isDefined("form.svgCode") AND Len(Trim(form.svgCode))>
  <CFQUERY NAME="saveSVG">
    UPDATE sketch
    SET sketch_svg = '#form.svgCode#' 
    WHERE  ordID = #Val(form.ordID)#
  </CFQUERY>
</cfif>
于 2012-11-04T06:54:08.547 に答える