Информацию (файлы) большого размера (изображения, документы, архивы) оптимально размещать в отдельном файле (например, с именем BIGCONTENT) Структура файла:
При этом имя загруженного файла хранится в родительской таблице (например, поле ANAME). В описание родительского экрана вносим следующее содержание:
1. В экран добавим пустой виджет для последующего размещения в нем виджета zzContent:
2. В фрагменте SETUP вставляем виджет zzContent в экран, и загружаем данные из таблицы BIGCONTENT
mem.heap.wco=zzContent()
mem.w.wco.layout().addWidget(mem.heap.wco)
if mem.editMode in ["EDIT"]:
mem.heap.wco.acontent=gi("bigcontent","parent_uid",mem.s.uid,"content")
mem.heap.wco.setFileName(mem.s.aname)
if mem.editMode in ["COPY"]:
mem.heap.wco.acontent=gi("bigcontent","parent_uid",mem.t.r.uid,"content")
mem.heap.wco.setFileName(mem.s.aname)
mem.heap.wco.butRefresh()
3. В фрагменте VALID размещаем код для сохранения данных в таблицу BIGCONTENT.
mem.s.aname=mem.heap.wco.afile
if mem.writeData():
bc=zzCursor("select 1 as bc from bigcontent where PARENT_UID=%s" % mem.s.uid).r.bc
if bc=="1":
uid=gi("bigcontent","parent_uid",mem.s.uid,"uid")
update("bigcontent",{'CONTENT':mem.heap.wco.acontent,'UID':uid,'PARENT_UID':mem.s.uid})
else:
insert("bigcontent",{'CONTENT':mem.heap.wco.acontent,'PARENT_UID':mem.s.uid})
RETURN=True
4. В фрагменте INIT размещаем код для удаления записи из BIGCONTENT при удалении родительской записи.
def afterScDelete(mem):
def realDo():
zzCursor("delete from bigcontent where parent_uid=%s" % mem.t.r.uid)
return realDo
mem.afterScDelete=afterScDelete(mem)
5. Код для выгрузки и просмотра содержимого, вставляется в меню для родительской таблицы (mem.t.r).
if mem.t.r.aname!="":
if glob.glob("temp")==[]:
try:
os.mkdir("temp")
except:
zzMess(u"Не удалось создать папку для размещения временных файлов")
if glob.glob("temp")!=[]:
try:
up=open("temp/%s" % mem.t.r.aname, "wb")
acontent=gi("bigcontent","parent_uid",mem.t.r.uid,"content")
# print acontent
up.write(acontent.strip().decode("hex"))
up.close()
try:
os.startfile('temp\\%s' % mem.t.r.aname)
except:
zzMess(u"Не удалось запустить программу для просмотра файла %s" % mem.t.r.aname)
except:
zzMess(u"""Не удалось создать временный файл <b>%s</b>!!!
Возможно файл с таким именем уже открыт в папке с
временными файлами <b>%s\\temp</b>""" % (mem.t.r.aname,os.getcwd()))
Короткий код для выгрузки и открытия файла:
zz=zzContent()
zz.acontent=gi("bigcontent","parent_uid",mem.t.r.uid,"content")
zz.afile=gi("bigcontent","parent_uid",mem.t.r.uid,"aname")
zz.contOpen()