Форум » [x]Harbour » Хранение *.zip файлов в базе ? » Ответить

Хранение *.zip файлов в базе ?

Andrey: Сделал запись zip-файлов в мемо-поля базы (драйвер DBFCDX). Файлы записываются без ошибок, только после извлечения из мемо-поля - архив становиться "битым" и не распаковывается. Как победить это ? Или нужно другую базу использовать ?

Ответов - 29, стр: 1 2 All

Dima: Andrey Ну накосячил видимо.......... Пример сложно было дать ? [pre2] local a request DBFCDX dbcreate("test",{{"mmm","m",10,0}},"DBFCDX",.t.,"TEMP") TEMP->(dbappend()) a:=filestr("test.zip") TEMP->mmm:=a close all use test alias TEMP new strfile(TEMP->mmm,"test1.zip") close all if hb_md5file("test.zip")==hb_md5file("test1.zip") ? "ok" else ? "bad" endif [/pre2] PS У мну выдало OK ZIP я считывал реальный.

Andrey: Dima пишет: Пример сложно было дать ? Дя я не знал.... Выкладываю целиком его на МиниГуи. https://cloud.mail.ru/public/8MDq/upmSqF2xn У меня база открывается так: USE .... CODEPAGE "RU866" VIA "DBFCDX" NEW EXCLUSIVE MD5 проверяю до загрузки в базу и после записи. У меня не совпадает. Что-то наверно обрезается при записи. Может с этим связано ?

Dima: Попробовал и с RU866 и заюзал те же функции как у тебя Вместо filestr -> HB_MEMOREAD Вместо strfile -> HB_MemoWrit Результат тот же , все OK Я бы на твоем месте затестил это дело на простом примере типа моего и после того как будет достигнут положительный результат , портировал в Minigui.


Andrey: Dima пишет: Я бы на твоем месте затестил это дело на простом примере типа моего и после того как будет достигнут положительный результат , портировал в Minigui. Подозреваю разное использование функций в Zip (у тебя Харбор, а у меня в МиниГуи другая библиотека используется). А почему мой пример не идёт ? Где косяк ?

Dima: Андрей а при чем тут функции ZIP вообще ? В моем примере их нет совсем.

Andrey: Dima пишет: Андрей а при чем тут функции ZIP вообще ? В моем примере их нет совсем. Может и не причём...

Dima: возьми мой пример и подсунь ему свой ZIP и глянь результат. в конце примера только добавь Ferase("test1.zip") PS Кстати ,если сложишь куда ни будь свой ZIP на котором не сходится MD5 , я проверил бы у себя.

Andrey: Dima пишет: Кстати ,если сложишь куда ни будь свой ZIP на котором не сходится MD5 , я проверил бы у себя. Запусти мой проект - у тебя получиться тоже самое что и у меня. Битые zip из текстовых файлов. Там проект короткий и простой, все файлы из папки FR3 архивируются в zip и далее пишутся в мемо-поле. Потом из мемо-поля пишу в файл (он уже становится битым) и пытаюсь разархивировать. Просто у тебя один файл, а я делаю несколько файлов. Я забыл уже, а как работать с базой где BLOB поля можно использовать ? Подскажи пожалуйста ссылку.

Dima: Andrey пишет: Я забыл уже, а как работать с базой где BLOB поля можно использовать ? Подскажи пожалуйста ссылку. Поиск по форуму по слову BLOB. Далее "фильтруй" то что нашел.

Pasha: В примере устанавливается кодовая страница 1251, а dbf открывается с 866-й. При этом в операциях с dbf выполняется перекодировка по кодовым страницам Надо заменить тип поля с memo AADD( aDbf , {"FMEMO" ,"M", 10,0 } ) на BLOB: AADD( aDbf , {"FMEMO" ,"W", 4,0 } ) и тогда перекодировка выполняться не будет. Другой вариант - открывать dbf без указания codepage

Andrey: Спасибо БОЛЬШОЕ Pasha !

Andrey: Нашёл ещё один вариант. Делаю сжатие строки и конвертирую строку MIME, а потом записываю в мемо-поле: cBuff := HB_MemoRead(cFile) cPackBuff := ZipCompress( cBuff ) // изпользую HB_Compress(cBuff) из xHarbour Language Reference Guide // ---- для любителей всё шифровать ---- //cPackBuff := HB_Crypt( cPackBuff, "Мой_пароль" ) cBuff64 := HB_Base64Encode( cPackBuff, LEN(cPackBuff) ) FIELD->FMEMO := cBuff64 Обратные действия: cBuff64 := FIELD->FMEMO cPackBuff := HB_Base64Decode( cBuff64 ) cBuff := ZipUncompress( cPackBuff ) // изпользую HB_Uncompress() из xHarbour Language Reference Guide // ---- для любителей всё шифровать ---- // cBuff := HB_DeCrypt( cBuff, "Мой_пароль" ) HB_MemoWrit( PATH_TEST + cFile, cBuff ) Так как строки пакуются, база меньше раза в 1.5 - 2 ! Пробовал ехе-ник на 17Мб - тоже хорошо пишется в/из базы. Можно теперь хранить любые данные в базах и для LetoDB ! Выкладываю исходник - https://cloud.mail.ru/public/Cp97/yM2KA9ba3 Используются функции: MsgLog(), DirEval(), ZipCompress(), ZipUncompress(), HB_Base64Encode(), HB_Base64Decode()

Andrey: Вопрос по базе созрел. Стоит ли создавать индексный файл для базы примерно в 100 - 150 записей ? Нужен только поиск по базе типа: LOCATE FOR UPPER(FIELD->FNAME) == PADR("TEST.TXT",65)

Andrey: Пытаюсь иконки и bmp превратить в текстовые данные для помещения в коде программы. Делаю как раньше [pre2] cFile := "res\Hmg_2dbf64.ico" cBuff := HB_MemoRead(cFile) cRes := hb_Base64Encode( cBuff, Len( cBuff ) ) ? cFile ? 'cBuff := "' + cRes + '"' [/pre2] или так [pre2] cFile := ChangeFileExt( cFile, '.txt' ) HB_MemoWrit( cFile, cRes )[/pre2] Получаю в переменной cRes возврат каретки (знак CRLF) и строка cRes не в одной строке. Почему ? Сделал на сайте https://www.base64encode.net/file-to-base64 Переменная без CRLF В хХарборе есть функции HB_Base64DecodeFile() и HB_Base64EncodeFile() А в Харборе как они называются ?

Andrey: С первым вопросом проехали, разобрался. [pre2]Вместо cRes := hb_Base64Encode( cBuff, Len( cBuff ) ) надо cRes := hb_Base64Encode( cBuff ) [/pre2] Тогда не будет возврата каретки (знак CRLF) в строке.

PSP: Andrey пишет: Пытаюсь иконки и bmp превратить в текстовые данные для помещения в коде программы. Делаю как раньше cFile := "res\Hmg_2dbf64.ico" cBuff := HB_MemoRead(cFile) А почему hb_memoread? Она ж вроде для текстовых файлов предназначена, не? Иконки и бмп - не текстовые.

Dima: PSP пишет: А почему hb_memoread? Тоже использую её для PNG файлов ->hb_Base64Encode с последующей передачей через socket , проблем не было

PSP: Dima пишет: Тоже использую её для PNG файлов ->hb_Base64Encode с последующей передачей через socket , проблем не было Ну, х.з.)

Dima: PSP пишет: Ну, х.з.) ну я тоже так думал как ты и поэтому сделал тестик типа [pre2] hb_memowrit( "test2.png",HB_MemoRead( "test.png" ) ) [/pre2] всё путем ни один байт не пострадал ))

PSP: Ладно-ладно, я ж не спорю



полная версия страницы