OAF_文件系列4_实现OAF上传显示数据库动态图片Image(案例)

简介: 20150805 Created By BaoXinjian 一、摘要 实现的过程 Step1. 通过数据库中BLOB栏位保存Image类型图片 Step2. 将BLOB类型Item通过messageupload上传至Database VO BLOB中 Step3.

 20150805 Created By BaoXinjian

一、摘要


实现的过程

Step1. 通过数据库中BLOB栏位保存Image类型图片

Step2. 将BLOB类型Item通过messageupload上传至Database VO BLOB中

Step3. 将VO BLOB通过OutStream写到Server文件系统中,并保存文件路径

Step4. 将文件路径设置到Image URL中,动态显示图片,功能可实现

 

二、实现方式


1. 创建Employee Image PG

 

2. 创建CO中初始化事件和文件上传后显示图片的作用

package bxj.oracle.apps.ap.employees.webui;

import bxj.oracle.apps.ap.employees.server.EmpManageAMImpl;
import bxj.oracle.apps.ap.employees.server.EmployeeImageVOImpl;

import java.io.Serializable;

import oracle.apps.fnd.common.VersionInfo;
import oracle.apps.fnd.framework.OAApplicationModule;
import oracle.apps.fnd.framework.webui.OAControllerImpl;
import oracle.apps.fnd.framework.webui.OAPageContext;
import oracle.apps.fnd.framework.webui.beans.OAImageBean;
import oracle.apps.fnd.framework.webui.beans.OAWebBean;

public class EmployeeImageCO extends OAControllerImpl
{
  public static final String RCS_ID="$Header$";
  public static final boolean RCS_ID_RECORDED =
        VersionInfo.recordClassVersion(RCS_ID, "%packagename%");

  /**初始化insert
  public void processRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processRequest(pageContext, webBean);
    
    EmpManageAMImpl am = (EmpManageAMImpl) pageContext.getApplicationModule(webBean);
    am.invokeMethod("initemployeeimage");
  }

  /**
  public void processFormRequest(OAPageContext pageContext, OAWebBean webBean)
  {
    super.processFormRequest(pageContext, webBean);
    
    OAApplicationModule am = pageContext.getApplicationModule(webBean);
    
    if ("upload".equals(pageContext.getParameter(EVENT_PARAM))) {
        am.getTransaction().commit();
        
        System.out.println("processRequest2");
        String employee_id = pageContext.getParameter("EmployeeId");
        //物理路径
        String phyPath = pageContext.getTemporaryImageLocation();
        //相对路径
        String relPath = pageContext.getTemporaryImageSource();
        System.out.println("co phyPath"+phyPath);
        System.out.println("co relPath"+relPath);
          
        /*以下两行注释用于生成唯一图片名,可视需要使用*/
        String imageName = "UserIcon"+employee_id+".gif";
        Serializable[] parameters = { employee_id, phyPath, imageName };
        am.invokeMethod("queryUser", parameters);
        
        OAImageBean image =  (OAImageBean)webBean.findIndexedChildRecursive("EmployeeImage");
        if (image != null) {
          image.setSource(relPath + imageName);
        }
    }
  }

}

 

3. AM中主方法

 //初始化
    public void initemployeeimage() {  
         EmployeeImageVOImpl vo =  this.getEmployeeImageVO();
         //vo.setMaxFetchSize(0);
         vo.setWhereClause(" EMPLOYEE_ID = 2 ");
         vo.executeQuery();
         
         System.out.println("initemployeeimage "+vo.getRowCount());
         //EmployeeImageVORowImpl employeeimagerow = (EmployeeImageVORowImpl) vo.createRow();
         //vo.insertRow(employeeimagerow);
         //employeeimagerow.setNewRowState(Row.STATUS_INITIALIZED);
    }  

    public void queryUser(String user_id, String phyPath, String imageName) {  
        //此处调用了视图的查询方法   
        EmployeeImageVOImpl empvo =  this.getEmployeeImageVO();
        EmployeeImageVORowImpl emprow = (EmployeeImageVORowImpl) empvo.getRowAtRangeIndex(0);
        BlobDomain image = emprow.getBlob();
        if (image != null) {
          initImage(image, phyPath, imageName);  
        }
    }   
        
    //使用IO流输出图片(AM代码):
    private void initImage(BlobDomain image, String phyPath, String imageName) {     
        File directory = new File(phyPath);     
        if (!directory.exists())     
          directory.mkdirs();     
          File imageFile = new File(directory, imageName);     
        try {     
           fromInputToOutput(image.getBinaryStream(), new FileOutputStream(imageFile));     
        } catch (Exception exception) {     
           exception.printStackTrace();     
        }     
        //DEBUG专用,看看路径对不对      
        System.out.println(imageFile.getAbsolutePath());     
    }     
        
    /*复制方法,图片大可以增大byte块*/    
    public void fromInputToOutput(InputStream inputstream, OutputStream outputstream) throws IOException {    
        byte abyte0[] = new byte[255];     
        for (int i = 255; i == 255; ) {     
          i = inputstream.read(abyte0);     
          if (i < 0)     
            break;     
            outputstream.write(abyte0, 0, i);     
        }     
        outputstream.close();     
        inputstream.close();     
    } 

 

三、运行测试


1. 将图片文件上传后,点击upload, 系统会将Image输出到server中,并将路径设置到Image URL

 

2. 文件上传成功, 查看数据库中BLOB类型的问题

 

3. 程式通过outstream将image文件写到server中

 

4. 通过引用server中写入的image,通过image item显示在页面中

 

四、总结注意


1. 如果不需要显示图片,而只是提供下载,那么使用MessageDownload会容易得多(无需手动输出)。

2. Image Item也可以用代码创建。

3. 由于OAF默认的图片文件夹是在OA_MEDIA下,如果使用视图的临时变量作为Image Item的 Image URL引用,图片地址会错误

4. 将图片存储于数据库中管理不易,性能也不如直接保存图片URL的好

5. 生成的图片不论原格式是JPG.PNG或是GIF,统一为GIF浏览器也可以显示出来

6. 此代码没有做安全处理,包括上传文件大小和文件类型

 

Thanks and Regards

参考: Tavor - http://shaofeng.blog.51cto.com/3392077/664142

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
数据库导入SQL文件:全面解析与操作指南
在数据库管理中,将SQL文件导入数据库是一个常见且重要的操作。无论是迁移数据、恢复备份,还是测试和开发环境搭建,掌握如何正确导入SQL文件都至关重要。本文将详细介绍数据库导入SQL文件的全过程,包括准备工作、操作步骤以及常见问题解决方案,旨在为数据库管理员和开发者提供全面的操作指南。一、准备工作在导
506 0
|
17天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
21天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
29天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
45 2
|
3月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
|
2月前
|
SQL 存储 关系型数据库
SQL文件导入MySQL数据库的详细指南
数据库中的数据转移是一项常规任务,无论是在数据迁移过程中,还是在数据备份、还原场景中,导入导出SQL文件显得尤为重要。特别是在使用MySQL数据库时,如何将SQL文件导入数据库是一项基本技能。本文将详细介绍如何将SQL文件导入MySQL数据库,并提供一个清晰、完整的步骤指南。这篇文章的内容字数大约在
373 1
|
2月前
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
343 10
|
2月前
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
187 6