写入图片文件先要1 将图片写入到unsigned char数组
2 插入empty_blob()
3 再插入图片
int readjpg(char *filename, byte* picbuff, unsigned int *amt)
{
/*组合完整路径*/
int ret = 0;
int filesize = 0;
char *path = getenv("PICDIR");
char fullpath[100];
memset(fullpath, 0, sizeof(fullpath));
strcpy(fullpath, path);
strcat(fullpath, "/");
strcat(fullpath, filename);
/*1 判断有无图片*/
FILE* fpic = NULL;
fpic = fopen(fullpath, "rb");
if(NULL == fpic)
{
BASLOG(LOG_LEVEL_ERROR, "[%s]文件打不开", fullpath);
return FAILURE;
}
/*获取文件大小*/
fseek(fpic, 0, SEEK_END);
filesize=ftell(fpic);
fseek(fpic, 0, SEEK_SET);
/*判断文件大小是否超过限制*/
if(filesize > PICMAX)
{
BASLOG(LOG_LEVEL_ERROR, "[%s]大小[%d]超过[%d]!", fullpath, filesize, PICMAX);
return FAILURE;
}
/*读取文件到数组*/
ret = fread(picbuff, sizeof(byte), PICMAX, fpic);
2 插入数据库用的是proc
*******************************************************************************/
#include <string.h>
#include "ums_dbs.h"
#include <oci.h>
#define PICTUREMAX 5*1024*1024
OCIBlobLocator *blob;
EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE "apptbldef.h";
/********************************************************************
* 函数名称: dbsInfcardrec
* 函数描述: 根据参数iDbOprType,申请制卡记录表进行操作
* 输入参数: int iDbOprType 数据表操作标志
* t_inf_card_rec_def *pt_inf_card_rec_def 表结构体
amt 图片大小 picbuff图片二进制流数组
* 输出参数:
* 返回值 :
* 0: 成功
* Other: 失败
* 调用者 :
********************************************************************/
int dbsInfcardrec(iDbOprType,pt_inf_card_rec_def,pStrSql, picbuff, amt)
EXEC SQL BEGIN DECLARE SECTION;
int iDbOprType;
t_inf_card_rec_def *pt_inf_card_rec_def;
char *pStrSql;
unsigned char* picbuff;
unsigned int amt;
EXEC SQL END DECLARE SECTION;
{
switch (iDbOprType)
{
case DBS_SELECT : /*根据身份证号查询数据表信息*/
EXEC SQL Select id_no INTO :pt_inf_card_rec_def->id_no From t_inf_card_rec
Where CARD_NO =:pt_inf_card_rec_def->id_no;
if (sqlca.sqlcode == 1405 || sqlca.sqlcode == -1405)
sqlca.sqlcode = 0;
if (sqlca.sqlcode == 1403 || sqlca.sqlcode == -1403)
{
sqlca.sqlcode = ORA_NO_DATA_FOUND;
}
break;
case DBS_INSERT : /*插入数据表信息 因为有blob类型数据所以跟一般的数据插入不一样*/
EXEC SQL ALLOCATE :blob;
EXEC SQL VAR picbuff IS RAW(PICTUREMAX);
EXEC SQL Insert Into t_inf_card_rec Values (
:pt_inf_card_rec_def->list_no,
:pt_inf_card_rec_def->id_no,
:pt_inf_card_rec_def->name,
'2',
null,
EMPTY_BLOB(),
'19470206',
'18980050711',
null,
null,
'1',
'1',
'01',
null,
'01',
'07',
EMPTY_BLOB(),
null,
null,
null,
'20170223',
null,
null,
null,
'1',
'20170223160558',
null,
'20170223160558',
'1',
'20170223160558',
'20170223',
null,null,
'02',
'20170223',
null,
null,
'20170223160558',
'1',
EMPTY_BLOB(),
'1',
null,
null) RETURNING picture INTO :blob;
if (sqlca.sqlcode == 1 || sqlca.sqlcode == -1)
sqlca.sqlcode = ORA_UNIQUE_VIOLATED;//返回一个位置插入图片
EXEC SQL LOB WRITE ONE :amt //插入二进制流图片
FROM :picbuff INTO :blob;
break;
default:
return -1;
}
return sqlca.sqlcode;
}
参考了https://www.csee.umbc.edu/portal/help/oracle8/server.815/a68022/lob.htm#1001868