jQuery的AJAX似乎改变发送到ColdFusion服务器SVG数据(jQuery ajax s

2019-07-03 13:36发布

我使用$阿贾克斯()来发送一个字符串,它被存储在一个表中的ColdFusion服务器。 当我后来查询,并尝试使用这些数据,我得到一个错误; “空封闭式例外: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方法了几次都没有太大的困难。 我在这里做得不对,我似乎无法得到它的句柄...

Answer 1:

我没用过,你已经使用了框架,但应将其设置的行svg变量使用getSVG查询?

<cfset svg = getSVG.svg>


Answer 2:

事情夫妇:

  1. 我假设你的存储SVG在UTF-8兼容场?
  2. 你能否确认SVG从DOM抓住它后发布之前是正确的?
  3. 在你的ColdFusion管理员,去你的数据源设置,然后单击“显示高级设置”。 确保箱子贴上了标签“启用配置的非拉丁字符的数据源高ASCII字符和Unicode”被选中。


Answer 3:

我继续努力和改进这个问题,并已收窄的问题。 我已经发布嗯,这并没有真正回答我的问题(并非$。阿贾克斯()FIX),但它确实解决这个问题......而不是使用jQuery阿贾克斯()来传递的SVG代码,我创建的CSS隐藏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>


文章来源: jQuery ajax seems to alter SVG data sent to coldfusion server