EAS单据中添加图片上传功能的两种实现方式最近在做一个功能,EAS的单据中支持在单据编辑界面上传图片,下面总结了两种实现方式,供大家参考。方式一、数据库存储图片的方式该方式是使用数据库字段存储图片数据;优点:开发实现方式简单,快捷;缺点:图片文件大小时对数据库有影响;实现方式如下:1、新增一个业务单元,在EditUI中添加KDLable控件,并设置控件的MouseClicked事件;2、修改实体,在实体中新增字段类型为byteArray的图片字段photo;修改table,添加字段类型为BLOB的数据库字段FPhoto;并将数据库字段与实体字段绑定。3、在XXEditUI.java文件中添加实现代码/***图片控件鼠标点击事件*/@Overrideprotectedvoidlabpic_mouseClicked(MouseEvente)throwsException{intcount=e.getClickCount();if(count==2){//双击选择图片selectPhoto();}elseif(count==3){//3击删除图片,此处为示例,可采用其他方式删除deletePhoto();}}/***删除图片*/privatevoiddeletePhoto(){inti=MsgBox.showConfirm2(this,"是否确认删除图片?");if(MsgBox.OK==i){labpic.setIcon(null);editData.setPhoto(null);}}/***选择图片*/privatevoidselectPhoto()throwsException{KDFileChooserfileChooser=newKDFileChooser();fileChooser.setFileFilter(newPictureFilter());fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);intresult=fileChooser.showOpenDialog(this);if(result==0){java.io.Filefile=fileChooser.getSelectedFile();byte[]bt=HRUtil.convertFileTOBytes(file);Imageimage=ImageIO.read(newByteArrayInputStream(bt));KDImageIconicon=newKDImageIcon(image);labpic.setIcon(icon);editData.setPhoto(bt);}}/***打开单据时加载图片*/@OverridepublicvoidonShow()throwsException{super.onShow();if(UIRuleUtil.isNotNull(editData.getPhoto())){Imageimage=ImageIO.read(newByteArrayInputStream(editData.getPhoto()));labpic.setIcon(newKDImageIcon(image));}}/***将photo字段添加到selector中*/@OverridepublicSelectorItemCollectiongetSelectors(){SelectorItemCollectionsic=super.getSelectors();sic.add(newSelectorItemInfo("photo"));returnsic;}4、实现效果如图方式二、附件存储图片的方式该方式是使用附件存储的方式存储图片数据;优点:采用附件方式存储,对数据库影响较小,可使用标准的附件管理功能进行查看管理;缺点:开发实现代码量相比数据库存储方式多,测试时需要多关注细节控制;实现方式如下:1、新增一个业务单元,在EditUI中添加KDLable控件,并设置控件的MouseClicked事件;2、在XXEditUI.java文件中添加实现代码BufferedImageImage;//图片文件privateStringpictureId="";//图片附件IDprivateFilepictureFile;//图片文件/***页面加载时展示图片*/@OverridepublicvoidloadFields(){super.loadFields();try{ClearImage();getPicture();}catch(Exceptione){e.printStackTrace();}}/***页面打开时加载图片*/@OverridepublicvoidonLoad()throwsException{super.onLoad();getPicture();}/***图片控件点击事件*/@Overrideprotectedvoidlabpic_mouseClicked(MouseEvente)throwsException{if(e.getClickCount()==2){showAsOriginaSize();//双击查看图片}else{if(e.getButton()!=3){return;}KDPopupMenupopupMenu=CreatePopuMenu();//添加右键菜单及右键菜单监听事件add(popupMenu);popupMenu.show(e.getComponent(),e.getX(),e.getY());}}/***添加右键菜单并添加监听事件*/KDPopupMenuCreatePopuMenu(){//右键上传图片菜单及监听事件KDPopupMenupopuMenu=newKDPopupMenu();KDMenuItemmItemAdd=newKDMenuItem(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialResource","ADD_Image"));ActionListenerlstAdd=newActionListener(){publicvoidactionPerformed(ActionEvente){try{TestPicEditUI.this.showAddImageDialog();}catch(Exceptione1){ExceptionHandler.handle(e1);}}};mItemAdd.addActionListener(lstAdd);popuMenu.add(mItemAdd);if(this.Image!=null){//右键另存图片菜单及监听事件KDMenuItemmItemSave=newKDMenuItem(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialResource","SAVE_Image"));ActionListenerlstSave=newActionListener(){publicvoidactionPerformed(ActionEvente){try{TestPicEditUI.this.showSaveDialog();}catch(Exceptione1){ExceptionHandler.handle(e1);}}};mItemSave.addActionListener(lstSave);popuMenu.add(mItemSave);//右键删除图片菜单及监听事件KDMenuItemmItemDelete=newKDMenuItem(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialResource","DELETE_Image"));ActionListenerlstDelete=newActionListener(){publicvoidactionPerformed(ActionEvente){try{TestPicEditUI.this.showdeleteImage();}catch(Exceptione1){ExceptionHandler.handle(e1);}}};mItemDelete.addActionListener(lstDelete);popuMenu.add(mItemDelete);//右键查看图片菜单及监听事件KDMenuItemmItemShowOriginaSize=newKDMenuItem(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialAddResource","ShowAsOriginaSize"));ActionListenerlstShowOriginaSize=newActionListener(){publicvoidactionPerformed(ActionEvente){try{TestPicEditUI.this.showAsOriginaSize();}catch(Exceptione1){ExceptionHandler.handle(e1);}}};mItemShowOriginaSize.addActionListener(lstShowOriginaSize);popuMenu.add(mItemShowOriginaSize);//单据查看状态时,清楚上传和删除菜单if(OprtState.VIEW.equals(getOprtState())){mItemAdd.removeActionListener(lstAdd);popuMenu.remove(mItemAdd);mItemDelete.removeActionListener(lstDelete);popuMenu.remove(mItemDelete);}}returnpopuMenu;}/***上传图片*/privatevoidshowAddImageDialog()throwsException{//只有保存的单据才可以上传图片if((((this.editData==null)||(this.editData.getId()==null)||(this.editData.getId().toString().equals(""))))&&(((this.editData==null)||(this.editData.getId()==null)))){MsgBox.showError(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialResource","msgBox_noBaseInfo"));SysUtil.abort();}if(getOprtState().equals(OprtState.VIEW)){return;}Filefile=chooseFileByDialog(this);if(file!=null){showImage(file);if(this.pictureFile!=null){Stringboid=this.editData.getId().toString();AttachmentClientManageracm=AttachmentManagerFactory.getClientManager();String[]attid=acm.getAttachmentIDsByBoIDAndCode(this.editData.getId().toString(),"picture");if(attid.length>=1){acm.deleteOneAssociation(boid,attid[0]);}this.pictureId=acm.addNewAttachment(boid,this.pictureFile,"picture");this.pictureFile=null;}}}/***选择图片文件*/privateFilechooseFileByDialog(Componentowner){FileretFile=null;booleanisRetFileValid=false;KDFileChooserfc=newKDFileChooser(System.getProperty("user.home"));fc.setFileFilter(newPictureFilter());//添加图片文件过滤fc.setFileSelectionMode(0);fc.setMultiSelectionEnabled(false);//设置不能多选while(!(isRetFileValid)){intretVal=fc.showOpenDialog(owner);if(retVal==1){returnretFile;}retFile=fc.getSelectedFile();if(retFile.exists()){if(retFile.length()<52428800L){//不能大于50MisRetFileValid=true;}else{MsgBox.showInfo(Resrcs.getString("FileSizeNotAllowed"));retFile=null;}}else{MsgBox.showInfo(Resrcs.getString("FileNotExisted"));retFile=null;}}returnretFile;}/***另存图片*/privatevoidshowSaveDialog(){KDFileChooserm_chooserSave=newKDFileChooser();m_chooserSave.setFileFilter(newPictureFilter());intresult=m_chooserSave.showSaveDialog(this);if(result!=0){return;}Filef=m_chooserSave.getSelectedFile();saveComponentToJPEG(f.getAbsolutePath()+f.getName()+".jpg");}/***另存为jpg格式图片*/privatevoidsaveComponentToJPEG(StringfileName){try{BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(fileName));JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(bos);JPEGEncodeParamjep=encoder.getDefaultJPEGEncodeParam(this.Image);jep.setQuality(1.0F,false);encoder.setJPEGEncodeParam(jep);encoder.encode(this.Image);bos.close();}catch(Exceptione){e.printStackTrace();}}/***删除图片*/privatevoidshowdeleteImage()throwsException{if((((this.editData==null)||(this.editData.getId()==null)||(this.editData.getId().toString().equals(""))))&&(((this.editData==null)||(this.editData.getId()==null)))){MsgBox.showError(EASResource.getString("com.kingdee.eas.basedata.master.material.MaterialResource","msgBox_noBaseInfo"));SysUtil.abort();}if(getOprtState().equals(OprtState.VIEW)){return;}if(confirmRemove()){if((this.pictureId!=null)&&(!(this.pictureId.equals("")))){deleteImage();}ClearImage();}}/***查看图片*/privatevoidshowAsOriginaSize(){if(this.Image==null)return;Dimensiondimension=Toolkit.getDefaultToolkit().getScreenSize();intwidth=this.Image.getWidth();intheight=this.Image.getHeight();if(width+15>dimension.width){width=dimension.width-15;}if(height+35>dimension.height){height=dimension.height-55;}JLabelpicLabel=newJLabel();ImageIconimageIcon=newImageIcon(this.Image);picLabel.setIcon(imageIcon);JScrollPanepicScrollPane=newJScrollPane(picLabel,20,30);JFramepicFrame=newJFrame();picFrame.getContentPane().setLayout(newBorderLayout());picFrame.getContentPane().add(picScrollPane,"Center");picFrame.setSize(width+15,height+35);picFrame.show();}/***删除附件中存储的图片信息*/privatevoiddeleteImage()throwsException{Stringboid=this.editData.getId().toString();AttachmentClientManageracm=AttachmentManagerFactory.getClientManager();String[]attid=acm.getAttachmentIDsByBoIDAndCode(this.editData.getId().toString(),"picture");if(attid.length>=1){acm.deleteOneAssociation(boid,attid[0]);}}/***清除界面图片信息*/privatevoidClearImage()throwsException{this.Image=null;this.pictureFile=null;this.pictureId="";this.labpic.setIcon(null);}/***获取附件中的图片信息*/privatevoidgetPicture()throwsException{if(this.editData==null){return;}if((this.editData.getId()==null)||(this.editData.getId().toString().equals(""))){return;}AttachmentClientManageracm=AttachmentManagerFactory.getClientManager();String[]attid=acm.getAttachmentIDsByBoIDAndCode(this.editData.getId().toString(),"picture");if(attid.length>=1){ComplexAttachmentInfoattinfo=acm.getComplexAttachmentInfo(attid[0]);if(attinfo!=null){byte[]data=attinfo.getContent();showImage(data);this.pictureId=attid[0];}else{this.pictureId="";}}else{this.pictureId="";}}/***展示图片file*/privatevoidshowImage(Filefile)throwsException{BufferedImageimg=ImageIO.read(file);if(img==null){thrownewMaterialBaseException(MaterialBaseException.INVALID_IMAGE);}KDImageIconicon=newKDImageIcon(img);this.labpic.setIcon(icon);this.Image=img;this.pictureFile=file;}/***展示图片byte*/privatevoidshowImage(byte[]data)throwsException{ByteArrayInputStreambais=newByteArrayInputStream(data);BufferedImageimg=ImageIO.read(bais);KDImageIconicon=newKDImageIcon(img);this.labpic.setIcon(icon);this.Image=img;this.pictureFile=null;bais.close();}3、实现效果