Russian Qt Forum
Ноябрь 24, 2024, 03:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Как записать файл в Базу  (Прочитано 13846 раз)
Mish_ka
Гость
« : Май 13, 2011, 04:13 »

использую QSQLite
хочу записать файл в БД, разные, есть картинки, есть текстовики, есть exe'шники
таблица создана правильно поле BLOB

пробывал записывать так:
Код
C++ (Qt)
QByteArray b;
while (!oFile.atEnd()){
b.append(oFile.readLine());
}

файлы с текстом записываются нормально, а вот другие непонять как, записываются первые несколько символов.

пните в правильном направлении...
« Последнее редактирование: Май 13, 2011, 10:20 от Mish_ka » Записан
ieroglif
Гость
« Ответ #1 : Май 13, 2011, 04:17 »

Код
C++ (Qt)
QFile f("pathToFile");
f.open(QIODevice::ReadOnly);
QByteArray = f.readAll();
f.close();
Записан
Mish_ka
Гость
« Ответ #2 : Май 13, 2011, 04:23 »

та же самая петрушка... =(
Записан
Mish_ka
Гость
« Ответ #3 : Май 13, 2011, 08:20 »

Как я понял.
Пример с верху работает корректно.
Проблема записи в БД
и чтения оттуда именно этого QByteArray

я таблицу создаю так:
Код
C++ (Qt)
q.exec("CREATE TABLE tbl (TIP INTEGER NOT NULL, Patch TEXT NOT NULL, File BLOB NOT NULL);");

пишу туда так:
Код
C++ (Qt)
QString Tip;
QString puts;
QByteArray b;
q.exec("INSERT INTO tbl (TIP, Patch, File) VALUES ("+Tip+",'"+puts+"','"+b+"');");

вот b криво и записываетя, неполностью

читаю так:
Код
C++ (Qt)
q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
QByteArray z=q.value(2).toByteArray(); // возвращает пустую строчку;
QString z=q.value(2).toString(); // возвращает то что написано в ячейке




задача взять файл засунуть в базу, вытащить из базы, записать новый файл. (PNG DOC EXE ...)


Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Май 13, 2011, 08:56 »

Конечно фигня писаться будет. Используй prepare и bindValue.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mish_ka
Гость
« Ответ #5 : Май 13, 2011, 09:14 »

можно пример?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Май 13, 2011, 09:17 »

А в ассистент заглянуть?

Код
C++ (Qt)
query.prepare ("INSERT INTO tbl (TIP, Patch, File) VALUES (:TIP, :Patch, :File);");
query.bindValue (":TIP", Tip);
query.bindValue (":Patch", puts);
query.bindValue (":File", b);
query.exec ();
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mish_ka
Гость
« Ответ #7 : Май 13, 2011, 09:34 »

Изначально я делал так. Потом где-то нагуглил что делать лучше подругому (как у меня в примере) =(((.

Да всё работает корректно.

Извиняюсь за наглость.

Но в асистенте и в гугле нет внятного ответа как вытаскивать данные.
Может подскажите?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Май 13, 2011, 09:40 »

Может лучше перед сохранением перегонять в base64 и при извлечении делать обратное преобразование?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mish_ka
Гость
« Ответ #9 : Май 13, 2011, 09:48 »

засунуть
Код
C++ (Qt)
qint64 bb=b.toBase64();
выдаёт ошибку "within this context"

вытащить
Код
C++ (Qt)
QByteArray z=q.value(2).toByteArray();

Я правильно Вас понял?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Май 13, 2011, 09:52 »

qint64 bb - это тут при чем?
QByteArray QByteArray::toBase64 () const

Извлечь:
const QByteArray z=QByteArray::fromBase64 (q.value(2).toByteArray());
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Mish_ka
Гость
« Ответ #11 : Май 13, 2011, 10:14 »

Всё работает. Всё пишет.

Проблема в том, что пишет не то =)

Текстовики нормально переписываются, а вот картинки и прочее уже не открываются =(
Записан
Mish_ka
Гость
« Ответ #12 : Май 13, 2011, 10:17 »

ой извиняюсь. мой косяк, при записи не тот флаг тыкал =)
Записан
Mish_ka
Гость
« Ответ #13 : Май 13, 2011, 10:20 »

Спасибо всем!

Итак итог:

Пишем файл в базу:
Код
C++ (Qt)
QByteArray b = oFile.readAll();
QByteArray bb=b.toBase64();
q.prepare ("INSERT INTO tbl (TIP, Patch, File) VALUES (:TIP, :Patch, :File);");
q.bindValue (":TIP", Tip);
q.bindValue (":Patch", puts);
q.bindValue (":File", bb);

Читаем файл из базы:
Код
C++ (Qt)
q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
while(q.next()){
    QByteArray z=QByteArray::fromBase64 (q.value(2).toByteArray());
    destFile2.write(z);
}
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #14 : Май 13, 2011, 13:58 »

Изначально я делал так. Потом где-то нагуглил что делать лучше подругому (как у меня в примере.
Верный путь к sql-инъекциям.

q.exec("SELECT * FROM tbl WHERE Patch='"+puts+"' ;");
Пишите как вам посоветовали:
Код
C++ (Qt)
       query.prepare("SELECT File FROM tbl WHERE Patch=:Patch;");
       query.bindValue (":Patch", puts);
 

В Base64 тоже смысла переводить нет. Размер это увеличивает, а работать оно и без этого будет.
Вот пример (blob.sqlite должно быть в рабочей папке):
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.416 секунд. Запросов: 23.