0

在从 SQL 表中获取 SVG 代码并将其传递到 Batik 以对其进行转码(显示 PNG)之间存在一些我不明白的事情。

如果我运行下面的 CF 代码,我会收到错误:无法显示图像,因为它包含错误。这是其中任何一个产生的唯一错误。

我还使用返回 true 的 isXML() 测试了表中的值。

但如果我:

  1. 取消注释第 1 节,
  2. 复制 CFDUMP 生成的 SVG 代码,
  3. 在第 2 节中将该 SVG 代码粘贴回 CFSET 中,
  4. 并重新注释掉评论部分 1

然后 PNG 按预期显示在浏览器中。在 CFDUMP 中显示 SVG 代码,然后手动将其粘贴到代码中以某种方式(神秘地)使用它的过程会改变它,因此它可以工作......

我尝试了各种变化。当它在 CFDUMP 中显示 SVG 代码时,ColdFusion 似乎在做一些我不理解的事情(或者可能是 SQL 的某种字符集问题?)。

有人知道这可能是什么吗?我受阻了。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<CFQUERY NAME="getSketch">
  SELECT sketch_svg AS svg
  FROM sketch
  WHERE  ordID = 1
</CFQUERY>
<cfset svg = Replace(getSketch.svg,'&quot;','','all')>

<!--- Commented-out Section 1
<cfset svg = Replace(svg,"'","''",'all')>
<cfset svg = Replace(svg,"##","####",'all')>
<CFDUMP var="#svg#" abort>
--->

<!--- Commented-out Section 2
<cfset svg = '[Manually paste SVG code from CFDUMP here...]'>
 --->

<!--- The following takes the svg code and displays it as a PNG in the browser - This works fine if the SVG code is okay...)  --->
<cfscript>
  context = getPageContext();
  context.setFlushOutput(false);
  response = context.getResponse().getResponse();
  response.setContentType("image/png");
  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);
  outputStream = response.getOutputStream();
  output = createObject("java", "org.apache.batik.transcoder.TranscoderOutput").init(outputStream);
  transcoder.transcode(input, output);
  output.close();
  outputStream.close();
</cfscript>
4

0 回答 0