|
版本: |
BeX5V3.5 |
小版本号: |
|
|
|
数据库: |
Oracle |
服务器操作系统: |
Windows |
应用服务器: |
Tomcat |
客户端操作系统: |
Windows 8 |
浏览器: |
Chrome |
|
|
本帖最后由 cactus78 于 2016-10-21 10:10 编辑
找了半天,也没找到一个比较全面的能实现这个功能的帖子,发现好多人问,特分享出来,以便大家参考少走弯路。
参考帖子:
1、动态生成二维码,需要jquery.qrcode.min.js。
源码:https://github.com/haoxiaobo/jquery-qrcode
2、通过Canvas及File API缩放并上传图片
http://blog.csdn.net/renfufei/article/details/9836317
2、BeX5 ---在报表中显示blobImage上传的图片:
http://bbs.wex5.com/forum.php?mo ... 3135&extra=page%3D4
进入正题:
一、首先生成二维码:
两种情况:
1、生成完毕,直接创建一个超链接,点击便可下载
- Model.prototype.button1Click = function(event){
- var qrcodeElmt = this.getElementByXid("qrcode");//div的xid
- qrcodeElmt.innerHTML = "";
- $(qrcodeElmt).qrcode({
- render :"canvas",
- text: "http://www.baidu.com",
- height: 300,
- width: 300//,
- //src: 'img/head.png'
- });
- var cavas = qrcodeElmt.children[0];
- var imgUrl = cavas.toDataURL("image/png");
- var a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
- a.href = imgUrl;
- a.download = "123";
- a.innerHTML = "下载图片"
- var event = document.createEvent('MouseEvents');
- event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- a.dispatchEvent(event);
- };
复制代码
2、生成完成后,用ajax保存到后台blobImage中:
首先,应该有一条相应的数据,(数据库表【对应的概念中的关系】中失少有两个blobImage的字段,一个存储blobImage的字段,类型blob,一个存储blobImage修改时间的字段,类型datetime;还得有个id字段)。
blobImage组件配置如下图:
- Model.prototype.button1Click = function(event){
- var me = this;
- var blobImage = this.comp("blobImage1");//页面中的blobImage组件
- var fID = this.comp("dialogData").getValue(blobImage.blobConcept);//获得这条记录的fID(实际上就是概念名)
- var url = "http://www.baidu.com";
- var qrcodeElmt = this.getElementByXid("qrcode");
- qrcodeElmt.innerHTML = "";
- $(qrcodeElmt).qrcode({
- render :"canvas",
- text: url,//这是二维码内储存的信息
- height: 300,
- width: 300//,
- //src: 'img/head.png'
- });
- var cavas = qrcodeElmt.children[0];
- var imgData = cavas.toDataURL("image/png");
- //alert(imgData);
- var params = new Request.ActionParam();
- params.setString("blobDataModel", blobImage.blobDataModel);
- params.setString("blobConcept", blobImage.blobConcept);
- params.setString("blobRelation", blobImage.blobRelation);
- params.setString("blobLastModifiedRelation", blobImage.blobLastModifiedRelation);
- params.setString("limitSize", blobImage.limitSize);
- params.setString("blobConceptValue", fID);
- params.setString("blobData", imgData);
- //alert(imgData);
- Request.sendBizRequest({
- contentType : 'application/xml',//用application/json报错(好像是XX.toJSON不是方法),不知为啥
- //dataType : "json",
- context : me.getContext(),
- parameters : params,
- action : "blobUpdateAction",//懒了,用了系统的上传
- callback : function(callbackData) {
- blobImage.refresh();//必须刷新,否则不显示
- if(!callbackData.state){
- Request.errorMessage(callbackData, "执行失败!", null, null);
- }
- }
- });
- };
复制代码
二、保存到数据库
process处理前事件,生成设备二维码,保存blobImage之前处理blobData数据,强烈建议自己写一个上传的Action
挺简单的大概就是 update 概念名 (blob关系名, updatetime关系名) values (?, ?) where 概念名 = ?;再把3个值赋进去就行了。
如果自定义上传Action就不需要下面这段代码了。
- //生成设备二维码,保存blobImage之前处理blobData数据,
- //把byte[]转成InputStream,否则报错,java.lang.IllegalArgumentException: argument type mismatch
- public static void equipmentProcessBeforeBlobUpdateAction() throws IOException {
- String imageData = null;
- try{
- imageData = (String) ContextHelper.getRequestContext().getActionContext().getParameter("blobData");
- }catch(Exception e){
- return;//报错说明是系统按钮上传
- }
- imageData = imageData.substring(22);
- //System.out.println(imageData);
- BASE64Decoder decoder = new BASE64Decoder();
- byte[] data = decoder.decodeBuffer(imageData);
- for(int i=0; i < data.length; i++){
- if(data[i]<0)
- data[i] += 256;//调整异常数据
- }
- InputStream image = new ByteArrayInputStream(data);//把byte转成InputStream
- ContextHelper.getRequestContext().getActionContext().setParameter("blobData", image);
- }
复制代码
三、在报表中显示:
要在报表中显示图片,需要将单元格设置成display-type:image,然后这个单元格关联的数据必须是一个图片的有效URL,所以需要自定义queryAction把blob下载下来,再组装一个URL,代码如下:
- public static Table printMeterCard(String concept,String idColumn,String select,String from,String condition,List range,String filter,Boolean distinct,Integer offset,Integer limit,String columns,String orderBy,String aggregate,String aggregateColumns,Map variables,String dataModel,String fnModel){
- //System.out.println("SELECT " + select + " FROM " + from + "; dataModel:" + dataModel);
- Table t = BizData.query(concept, idColumn, select, from, condition, range, filter, distinct, offset, limit, columns, orderBy, aggregate,
- aggregateColumns, variables, dataModel, fnModel);
- Iterator<Row> it = t.iterator();
- while (it.hasNext()) {
- Row r = it.next();
- String url = "/UI2/system/components/justep/blob/server/download.j"
- + "?process=/logistics/product/process/equipment/equipmentProcess" //流程名称
- + "&activity=printMeterCardActivity" //环节名称
- + "&action=blobDownloadAction" //调用的Action
- + "&blobDataModel=/logistics/product/data" //数据模块目录
- + "&blobConcept=PR_Equipment" //概念名
- + "&blobRelation=fQRCode" //关系名
- + "&blobConceptValue="
- + r.getValue("PR_Equipment")
- + "&$query-version="
- + com.justep.system.util.CommonUtils.createGUID()
- + "&bsessionid="
- + ActionUtils.getRequestContext().getSessionContext().getSessionID();
- r.setString("fRemark", url); //将url存入table对象,不用增加一个专门的url关系,随便设到一个不需要在报表中显示的关系中即可
- }
- return t;
- }
复制代码
|
评分
-
查看全部评分
|