1

我正在使用 $.ajax() 将字符串发送到存储在表中的冷融合服务器。当我稍后查询并尝试使用该数据时,我得到一个错误;“空封闭异常: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

我没有使用您使用的框架,但是您设置svg变量的行是否应该使用getSVG查询?

<cfset svg = getSVG.svg>
于 2012-11-04T06:05:28.353 回答
0

几件事:

  1. 我假设您将 SVG 存储在 UTF-8 兼容字段中?
  2. 在从 DOM 中获取 SVG 并在发布之前,您能否确认 SVG 是正确的?
  3. 在您的 ColdFusion 管理员中,转到您的数据源设置并单击“显示高级设置”。确保选中标记为“为配置为非拉丁字符的数据源启用高位 ASCII 字符和 Unicode”的框。
于 2012-11-04T21:32:55.860 回答
-1

我一直在研究和完善这个问题,并缩小了问题的范围。我已经发布了好吧,这并不能真正回答我的问题(不是 $.ajax() 修复),但它确实解决了问题......我没有使用 jQuery ajax() 来传递 svg 代码,而是创建了一个 css-hidden div 中包含一个表单和一个 iFrame。我使用 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 回答