如何用mysql 的c api 对jpg文件的读写?

园区宅男 2009-05-08 08:33:24
数据表字段类型BLOB

读写数据的语句如何写?
请专家们指点。最好有例子,谢谢!
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
园区宅男 2009-05-13
  • 打赏
  • 举报
回复

int CmysqlDatabase::UpdateBlob(Data_Param *para, FILE *f)
{
char query[1024*800],buf[1024*100],*p=NULL,cwhere[256];
unsigned long blob_len;
mysql_query(&mysql,"set names 'utf8'"); //这一行很重要,否则可能会上传失败
sprintf(query,"update %s set %s = \'",para->tab_name, para->set_exp);
p = query + strlen (query);
unsigned int bufsize = sizeof(buf);
while((blob_len = fread (buf, 1, bufsize, f)) > 0)
{
if(p + (2*blob_len) + 3 > query + sizeof (query))
{
TRACE("image too big\n");
return false;
}
p += mysql_real_escape_string(&mysql, p, buf, blob_len);
}
*p++ = '\'';
sprintf(cwhere," where %s",para->where_def);
int wherelen = strlen(cwhere);
memcpy(p,cwhere,wherelen);
p += wherelen;

unsigned long lsize = (unsigned long)(p-query);
if(mysql_real_query(&mysql, query, lsize))
{
TRACE(((char*)mysql_error(&mysql)));
return false;
}
TRACE(((char*)mysql_error(&mysql)));
return true;
}

//下面是调用
FILE *f;
if((f = fopen(m_issue_picpath, "rb")) == NULL)
{
TRACE("file open eror!\n");
m_issue_picpath = "照片文件打开失败!";
UpdateData(FALSE);
return;
}
theApp.mData.tab_name = "repair_process";
strwhere.Format("RPId = \'%d\'",iInsertId);
theApp.mData.where_def = (LPSTR)(LPCTSTR)strwhere;
strExp.Format("RPIssuePic");
theApp.mData.set_exp = (LPSTR)(LPCTSTR)strExp;

if(theApp.mwipd.UpdateBlob(&theApp.mData,f))
{
TRACE("更新照片成功!\n");
}
else
m_issue_picpath = "更新照片失败!";
fclose(f);

ACMAIN_CHM 2009-05-11
  • 打赏
  • 举报
回复

没有HTTP,则只能用你的方法了,把图片文件写入到数据库。只是大部分场合不推荐这样做。
园区宅男 2009-05-11
  • 打赏
  • 举报
回复
服务器只有mysql服务,没有http或ftp服务.
ACMAIN_CHM 2009-05-11
  • 打赏
  • 举报
回复

如何用mysql提供的C API实现文件的存取?
http://topic.csdn.net/t/20030612/15/1907712.html#

MySQL C API 存取 blob这种例子应该很多了。 通过C读你的 图片二进制文件然后update到mysql

ljf_ljf 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gxg353 的回复:]
一般的图片 数据库只是存取他的连接地址 图片还是放到硬盘上好
[/Quote]

完全赞同。
园区宅男 2009-05-11
  • 打赏
  • 举报
回复
原因找到了,字段类型用"LONGBLOB",没问题了。
园区宅男 2009-05-11
  • 打赏
  • 举报
回复

void CBlobDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CFileDialogEx dlg(TRUE,_T(""),_T(""),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("照片文件(*.jpg)|*.jpg|"));
if(IDOK==dlg.DoModal()){
m_detail_picpath=dlg.GetPathName();
UpdateData(FALSE);
}
}

void CBlobDlg::OnButton2()
{
UpdateData(TRUE);
// TODO: Add your control notification handler code here
char *opt_host_name = "vmxpcn";
char *opt_user_name = "root";
char *opt_password = "admin888";
unsigned int opt_port_num = 3306;
char *opt_socket_name = NULL;
char *opt_db_name = "wipdebug";
unsigned int opt_flags = 0;
MYSQL *conn;

FILE *f;

conn = mysql_init (NULL);

mysql_real_connect (conn, opt_host_name, opt_user_name, opt_password,
opt_db_name, opt_port_num, opt_socket_name, opt_flags);

if ((f = fopen (m_detail_picpath, "rb")) == NULL)
{
printf("file open eror!");
return;
}
load_image (conn, f);
fclose(f);

mysql_close (conn);

}

void CBlobDlg::load_image(MYSQL *conn, FILE *f)
{
char query[1024*200], buf[1024*100], *p;
unsigned long from_len;

sprintf(query,"insert into repair_process (RPIssuePic) values ( \'" );
p = query + strlen (query);
while ((from_len = fread (buf, 1, sizeof (buf), f)) > 0)
{
if (p + (2*from_len) + 3 > query + sizeof (query))
{
printf("image too big");
return;
}
p += mysql_real_escape_string (conn, p, buf, from_len);
}
*p++ = '\'';
*p++ = ')';
strcpy(p," where RPId=1");

// mysql_query(conn,"set character set gbk");
// TRACE(((char*)mysql_error(conn)));
mysql_real_query (conn, query, (unsigned long) (p- query));

TRACE(((char*)mysql_error(conn)));
}




插入示例图片:Blue hills.jpg没问题
插入示例图片:Sunset.jpg提示:Data too long for column 'RPIssuePic' at row 1
phpboy 2009-05-10
  • 打赏
  • 举报
回复
tommy9802 2009-05-08
  • 打赏
  • 举报
回复
读写数据库的方法与字段类型没有太大关系吧,正常读写就行,你遇到问题或错误了吗?
gxg353 2009-05-08
  • 打赏
  • 举报
回复
一般的图片 数据库只是存取他的连接地址 图片还是放到硬盘上好

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧