我有一个我动态生成的条形码,并希望传递给后来成为pdf的gsp。我不需要为了我自己的目的而坚持使用条形码,并且只想将图像从控制器传递给gsp。
有没有办法渲染作为变量传递的图像而不是指定src?
提前致谢。
编辑:
由于我是从gsp生成pdf的,因此我正在刷新响应的输出流,因此也无法对图像执行此操作,或者我收到错误。
此外,使用javascript / jQuery不起作用,因为页面永远不会被浏览器直接呈现。
看起来我唯一的选择就是暂时将图片保存在某处,然后将其删除......
答案 0 :(得分:2)
我最近回答了similar question,也许它的答案对你有用。我会把它的一部分贴在这里。这基本上是Oded的“在......之外......”的建议。
class BarcodeController {
def index = {
def img // byte array, set this to the binary contents of your image
response.setHeader('Content-length', img.length)
response.contentType = 'image/png' // or the appropriate image content type
response.outputStream << img
response.outputStream.flush()
}
}
然后,您可以在标签的src中访问您的图像,如下所示:
<img src="${g.link(controller: 'barcode', action: 'index')}"/>
这个答案似乎符合您对该问题的最后评论(关于使用PHP的类似解决方案)。
答案 1 :(得分:0)
您可以使用data URI scheme作为src属性。
数据URI方案是一种URI方案,它提供了一种在网页中包含数据的方法,就好像它们是外部资源一样。
以下是wikipeida文章的一个例子:
<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP
C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA
AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J
REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq
ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0
vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />
除此之外,如果您使用的是服务器端技术,则可以从脚本(使用正确的mime类型)流式传输图像数据,并将src属性指向它。
Here是关于Grails的相关SO问题。
答案 2 :(得分:0)
只想为这个古老的问题做出贡献。我通过在BuildConfig.groovy
中添加以下行来实现此目的:
在plugins
部分:
plugins {
// other plugins here
// ...
compile ":barcode4j:0.3"
compile ":rendering:1.0.0"
}
在dependencies
部分:
dependencies {
// other dependencies here
// ...
compile 'avalon-framework:avalon-framework:4.1.5'
}
然后我根据网上找到的代码示例添加了一个控制器。我特别需要一个DataMatrix生成器,但添加其他生成器应该很容易,只需向控制器添加方法即可。抱歉质量不好的代码(我是一个Groovy新手):
package myproject
import org.krysalis.barcode4j.impl.datamatrix.DataMatrix
import java.awt.Dimension
class BarcodeController {
// a valid PNG image, base64 encoded
static invalidBarcodeImgBase64 = """iVBORw0KGgoAA...=="""
// Needs index.gsp for testing
def index() {
['uuid': UUID.randomUUID(), 'fecha': new Date()]
}
def dataMatrix(String value) {
if ((null == value) || (value.length() < 1) || (value.length() > 2000)) {
def img = invalidBarcodeImgBase64.decodeBase64()
response.setHeader('Content-length', new Integer(img.length).toString())
response.contentType = 'image/png'
response.outputStream << img
response.outputStream.flush()
} else {
def generator = new DataMatrix()
generator.dataMatrixBean.setMinSize(new Dimension(16, 16))
renderBarcodePng(generator, value, [antiAlias: false])
}
}
def datamatrix(String value) {
dataMatrix(value)
}
}
最后在条形码视图中的index.gsp
进行测试:
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>DataMatrix</title>
</head>
<body>
<g:img dir="barcode" file="dataMatrix?value=${uuid}"/>
<br />
<br />
<g:img dir="barcode" file="dataMatrix?value=${fecha}"/>
<br />
<br />
<g:img dir="barcode" file="dataMatrix?value=Nothing to see here"/>
</body>
</html>