求助:图片存储
求助:
我用的是SQLServer2000的数据库,其中有个学生表t_student,有个字段s_picture(image型,
长度为16<好像是系统默认的长度,我改不了>)用来存照片,但是只要照片大于32kb,就存不到数据库中,这该怎么办啊?
问题点数:10、回复次数:12Top
1 楼hzliqing(蚂蚁牙黑)回复于 2006-06-01 15:00:20 得分 0
狠简单~~保证你的图片小于32k~~呵呵~我们单位的好像就是这么做的~Top
2 楼ghostagain(心情卡片)回复于 2006-06-01 15:02:58 得分 0
没分 打死都不说 (FAQ里去找)Top
3 楼zoezxc()回复于 2006-06-01 17:52:43 得分 0
好了,我已经为贴子加分了,不好意思,那是我的第一贴,我还以为我没分可加呢:)
ghostagain(心情卡片) 说的(FAQ里去找)是这个吧:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=201309
即:
先插入一行(没有图片),然后用updateblob更新,具体查查帮助。
---------------------------------------------------------------
先選擇圖片
string ls_path,ls_name
GetFileOpenName("選擇圖片文件", ls_Path, ls_name,'bmp',&
"支持的圖片文件格式,*.jpg;*.bmp;*.gif;*.rle;*.wmf,"+&
"位圖(.bmp),*.bmp,"+&
"JPEG(.jpg;.jpeg),*.jpg;*.jpeg,"+&
"RunLengthEncode(.rle),*.rle,"+&
"Windows MetaFile(.wmf),*.wmf")
if this.object.pic_flag[1] = '1' then
long ll_filelength//最大為2G
decimal{2} ldec_nk
ll_FileLength = FileLength(ls_path)
ldec_nk = round(ll_filelength / 1024,2)
if ldec_nk > 1024.00 THEN
messagebox('提示','您選擇的圖片大小為:'+string(ldec_nk)+'K,已經超過所規定的大小1024K',stopsign!)
return
end if
end if
if isnull(ls_name) or trim(ls_name)='' then return
p_1.PictureName = '.\'+ls_name
this.object.pic_path[1] = '.\'+ls_name//right(ls_path,pos(reverse(ls_path),'\') - 1)
this.object.pic_name[1] = ls_name
this.object.c_desc[1] = '圖片的具體位置:'+ ls_path
ii_flagtu = 1
---------------------------------------------------------------
selectblob取出图片数据。具体查查帮助,或者从前的帖子。
---------------------------------------------------------------
存圖片到數據庫
if dw_f.object.pic_flag[1] = '0' then goto byend
string ls_picname
ls_picname = trim(p_1.PictureName)
if not isnull(ls_picname) and trim(ls_picname)<>'' then
blob lbob_pic
lbob_pic = lf_dealpic(ls_picname)
//更新圖片文件要控制autocommit參數
sqlca.autocommit = True
updateblob z_size_pic_record set pic_data = :lbob_pic where sample_no = :ls_sample_no using sqlca;
sqlca.autocommit = False
if sqlca.sqlcode = 0 then
commit;
li_flag = 2
else
rollback;
li_flag = -2
end if
end if
byend:
choose case li_flag
case -1
messagebox('信息提示','圖片信息保存失敗!',stopsign!)
。。。。。。。。
。。。。。。。。
。。。。。。。。
---------------------------------------------------------------
然後從數據庫讀圖片到圖片控件
//處理圖片
Blob lbob_pic
decimal ldec_n_id
p_1.picturename = " "
SELECTBLOB pic_data
INTO :lbob_pic
FROM z_size_pic_record
WHERE sample_no = : ls_sample_no using sqlca;
if isnull(lbob_pic) then
p_1.picturename = dw_f.object.pic_path[1]
istr_pic.picturename = dw_f.object.pic_path[1]
else
p_1.SetPicture(lbob_pic)
istr_pic.picturevar = lbob_pic
end if
Top
4 楼zoezxc()回复于 2006-06-01 18:04:06 得分 0
我在"照片入库"按钮click()下的代码如下,但是数据库中只能存下32kb,超过32kb的部分,就存不下了.这该怎么办呢?请高人指教,多谢多谢
blob emp_pict
emp_pict=ole_1.objectdata
row_count=dw_student.rowcount()
if row_count>0 then
ksbh=trim(dw_student.getitemstring(dw_student.getrow(),"s_bkh"))
end if
updateblob "t_student" set s_picture=:emp_pict where s_bkh=:ksbh;
//s_bkh是数据库中,学生编号的字段
if sqlca.sqlnrows>0 then
commit;
messagebox("提示信息","存入"+string(len(emp_pict))+"个字符"+",入库成功")
else
rollback;
messagebox("提示信息","入库失败")
end ifTop
5 楼ghostagain(心情卡片)回复于 2006-06-01 20:13:27 得分 0
上传图片例子:
----------------------------------------
if dw_1.event ue_update () <> 1 then return
long ll_row
ll_row = dw_1.getRow ()
if ll_row < 0 then return
String ls_FileName, ls_pathName, ls_currDir
int li_ret, li_filePtr, li_loops, i
long ll_fileLen, ll_bytes_read, ll_new_pos
blob lbb_read, lbb_total
string ls_idNo //身份证号码
ls_idNo = dw_1.getItemString (ll_row, "身份证号码")
//ls_currDir = getCurrentDirectory () //当前路径
li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename, "jpg", &
"JPG文件(.jpg),*.jpg" )
//li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename, "jpg", &
// "JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp" )
//changeDirectory (ls_currDir)
IF Li_ret <= 0 then return
setPointer (hourGlass!)
li_filePtr = fileOpen (ls_pathName, STREAMMODE!, READ!, Shared!)
if li_filePtr <> 1 then
messageBox ("错误", "打开图形文件失败!", stopSign!)
return
end if
ll_fileLen = fileLength (ls_pathname)
if ll_fileLen > 32766 then
li_loops = long ((ll_fileLen - 1)/32766) + 1
else
li_loops = 1
end if
//messageBox (string (ll_fileLen) , string (li_loops) )
for i = 1 to li_loops step 1
ll_bytes_read = fileRead (li_filePtr, lbb_read)
lbb_total = lbb_total + lbb_read
ll_new_pos = ll_new_pos + ll_bytes_read
fileSeek (li_filePtr, ll_new_pos, FROMBEGINNING!)
next
FileClose (li_filePtr)
sqlca.autocommit = true
UPDATEBLOB J驾乘人员
SET 照片 = :lbb_total
WHERE 身份证号码 = :ls_idNo
USING SQLCA;
sqlca.autocommit = false
if SQLCA.SQLCode = 0 then
// messageBox ("提示", "保存图片成功!")
wf_showPic (ll_row)
else
messageBox ("数据库错误", "保存图片失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
end if
读图片例子:
------------------------------------------
//显示照片
string ls_idNo
string ls_fileName
long ll_row
blob lbb_text, lb_temp
ll_row = dw_1.getRow ()
if ll_row <= 0 then return 1
ls_idNo = dw_1.getItemString (ll_row, '身份证号码')
ls_fileName = gs_currDir + '\tempPic\' + n_sysInfo.is_top_name
setpointer (hourGlass!)
SELECTBLOB 照片
INTO :lbb_text
FROM J驾乘人员
WHERE 身份证号码 = :ls_idNo
USING SQLCA;
//messageBox ('',string ( len (lbb_text)/32766) )
if SQLCA.SQLCode = -1 then
messageBox ("数据库错误", "从数据库中读取文件失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
return -1
else
if len (lbb_text) > 0 then
long ll_handle, ll_fileLen, i, ll_loops
ll_handle = FileOpen(ls_fileName, StreamMode!, Write!, lockWrite!, replace!)
ll_fileLen = len(lbb_text)
if ll_fileLen > 32766 then
ll_loops = long ((ll_fileLen - 1)/32766) + 1
else
ll_loops = 1
end if
//messageBox (string (ll_fileLen) , string (ll_loops) ) //
For i=1 to ll_loops step 1
lb_temp = Blobmid(lbb_text,(i - 1)*32765+1,32765)
filewrite(ll_handle,lb_temp)
Next
FileClose(ll_handle)
string ls_nullStr
setNull (ls_nullStr)
ShellExecute(handle (this), ls_nullStr, ls_fileName, "shell32.dll", ls_nullStr, 0)
return 1
else
messageBox ("提示", "还没有上传文件,请先上传!", exclamation!)
return -1
end if
end if
setPointer (arrow!)
return 1Top
6 楼zoezxc()回复于 2006-06-06 22:18:02 得分 0
To ghostagain(心情卡片):
谢谢了:)
我把你贴出来的那几段程序,好好看了看,有几个还是看没明白,
//显示照片中的ls_fileName = gs_currDir + '\tempPic\' + n_sysInfo.is_top_name,
gs_currDir,n_sysInfo.is_top_name这几个是什么意思啊?应该在哪定义呢?Top
7 楼ghostagain(心情卡片)回复于 2006-06-07 08:39:42 得分 0
ls_fileName 是个文件名称,是将图片从数据库里取出来,暂时存放在本地磁盘力,然后显示在图片控件中
您可以计先就这样写试试:
ls_fileName = 'c:\temp.jpg'Top
8 楼zoezxc()回复于 2006-06-07 20:29:42 得分 0
To ghostagain(心情卡片):
我已按你的建议,改为ls_fileName = 'c:\temp.jpg';
到现在,我已经能把图片存入数据库,但是还有的问题是:把图片从数据库中拿出来显示不成功啊.急啊。
Top
9 楼ghostagain(心情卡片)回复于 2006-06-07 21:47:39 得分 0
贴出你的代码看看Top
10 楼zoezxc()回复于 2006-06-07 22:46:01 得分 0
1.按钮“照片入库”的代码如下:
long ll_row
ll_row = dw_student.getRow ()
if ll_row < 0 then return
String ls_FileName, ls_pathName, ls_currDir
int li_ret, li_filePtr, li_loops, i
long ll_fileLen, ll_bytes_read, ll_new_pos
blob lbb_read, lbb_total
string ls_idNo//学号
ls_idNo =dw_student.getItemString (ll_row, "s_bkh")
li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename, "jpg", &
"JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp" )
//ole_1.insertfile(ls_pathname)
IF Li_ret <= 0 then return
setPointer (hourGlass!)
li_filePtr = fileOpen (ls_pathName, STREAMMODE!, READ!, Shared!)
if li_filePtr <> 1 then
messageBox ("错误", "打开图形文件失败!", stopSign!)
return
end if
ll_fileLen = fileLength (ls_pathname)
if ll_fileLen > 32766 then
li_loops = long ((ll_fileLen - 1)/32766) + 1
else
li_loops = 1
end if
messageBox (string (ll_fileLen) , string (li_loops) )
for i = 1 to li_loops step 1
ll_bytes_read = fileRead (li_filePtr, lbb_read)
lbb_total = lbb_total + lbb_read
ll_new_pos = ll_new_pos + ll_bytes_read
fileSeek (li_filePtr, ll_new_pos, FROMBEGINNING!)
next
FileClose (li_filePtr)
sqlca.autocommit = true
UPDATEBLOB t_student
SET s_picture = :lbb_total
WHERE s_bkh = :ls_idNo
USING SQLCA;
sqlca.autocommit = true
if SQLCA.SQLCode = 0 then
messageBox ("提示", "保存图片成功!")
else
messageBox ("数据库错误", "保存图片失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
end if
2.按钮“显示图片”的代码如下:(运行后,它出现的错误是NOt a JPEG file:starts with 0x42 0x4d)
string ls_idNo
string ls_fileName,gs_currDir
long ll_row
blob lbb_text, lb_temp
ll_row = dw_student.getRow ()
if ll_row <= 0 then return 1
ls_idNo = dw_student.getItemString (ll_row, 's_bkh')
ls_fileName = 'c:\temp.jpg'
setpointer (hourGlass!)
sqlca.autocommit = true
SELECTBLOB s_picture
INTO :lbb_text
FROM t_student
WHERE s_bkh = :ls_idNo
USING SQLCA;
sqlca.autocommit = false
messageBox ("string ( len (lbb_text)/32766) :",'string ( len (lbb_text)/32766) :'+string ( len (lbb_text)/32766) )
p_1.setpicture(lbb_text)
if SQLCA.SQLCode = -1 then
messageBox ("数据库错误", "从数据库中读取文件失败!~r~n~r~n错误代码:" + &
string (sqlca.sqlDbCode) + "~r~n详细信息:" + &
sqlca.sqlERRText, stopSign!)
return -1
else
if len (lbb_text) > 0 then
long ll_handle, ll_fileLen, i, ll_loops
ll_handle = FileOpen(ls_fileName, StreamMode!, Write!, lockWrite!, replace!)
ll_fileLen = len(lbb_text)
if ll_fileLen > 32766 then
ll_loops = long ((ll_fileLen - 1)/32766) + 1
else
ll_loops = 1
end if
messageBox (string (ll_fileLen) , string (ll_loops) )
For i=1 to ll_loops step 1
lb_temp = Blobmid(lbb_text,(i - 1)*32765+1,32765)
filewrite(ll_handle,lb_temp)
Next
FileClose(ll_handle)
string ls_nullStr
setNull (ls_nullStr)
ShellExecute(handle (this), ls_nullStr, ls_fileName, ls_nullStr, ls_nullStr,1)
ole_1.insertfile(ls_fileName)
messageBox ("提示", "show!", exclamation!)
return 1
else
messageBox ("提示", "还没有上传文件,请先上传!", exclamation!)
return -1
end if
end if
setPointer (arrow!)
return 1Top
11 楼ghostagain(心情卡片)回复于 2006-06-08 09:23:43 得分 10
您上传的可能不是Jpg图片吧
这样您就应该在上传图片时候记录图片文件的后缀名(我原来的ls_fileName = gs_currDir + '\tempPic\' + n_sysInfo.is_top_name中的is_top_name是从数据库里面读出来的,包含了后缀名)
所以您还要在数据库里加一个字段记录后缀名,从数据库中读出图片临时存放在ls_fileName中,而ls_fileName的后缀名也应该从数据里面读Top
12 楼zoezxc()回复于 2006-06-21 12:49:39 得分 0
对ghostagain(心情卡片) 说声谢谢,呵呵:)Top




