Страница 1 из 2

Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 18:44
Rojohn
Добрый день!
Необходима консультация: возможно ли передавать фотографии (.jpg, .bmp) в файле XML или каким-нибудь похожим способом (как внедрённый объект) :?: Передача осуществляется в базу Oracle. Фотографии надо "запихнуть" в файл XML вручную из папки. Или только можно передавать ссылку на файл :?:
Спасибо!

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 18:58
Roman Koff
А экран <![CDATA[]]> не прокатит?

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:03
MIT
Base64?

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:05
Rojohn
А в каком виде размещать в него фотографию :?: Наверное что-то типо Base64 :?:
Как это делается?

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:09
FireFenix
Почему бы сразу не хранить в базе картинку без XML?

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:13
Rojohn
Всё не так: есть клиент на Access и VB, который хранит фото не в базе, а в папке. Из него делается выгрузка в Oracle и надо передать картинки, чтобы они попали в базу Oracle.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:15
FireFenix
Rojohn писал(а):Всё не так: есть клиент на Access и VD, который хранит фото не в базе, а в папке. Из него делается выгрузка в Oracle и надо передать картинки, чтобы они попали в базу Oracle.

Ну переносим данные с аксеса в оракл и картинку храним в оракле в поле с типом blob...
http://www.oracle-base.com/articles/9i/ ... HTTP9i.php
http://www.orafusion.com/oracf_image.htm

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 13.01.2010 (Ср) 19:18
Rojohn
Не... надо выгружать периодически из разных мест в России. Сейчас выгружается файлом XML без фото.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 11:03
Rojohn
По сути мне бы хотелось понять, как реализовать механизмы шифрования/дешифрования Base64. Кто знает или у кого есть примеры - просьба поделиться... :?:

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 11:40
Antonariy
Файл XML определенный или любой? Если любой, то можно фотку передать в рекордсете, сохраненном в xml. Делается пятью строчками. Если определенный, то из xml рекордсета вырезается узел с картинкой и вставляется в xml, который передается, на сервере обратная операция. 10-15 строчек.

Base64 можно найти здесь, если вспомнить о поиске.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 12:29
Rojohn
Интересно! А как в XML передавать рекордсет? Примерчик можно глянуть?
Нашёл такие штучки по Base64 - делюсь:

В модуль:
Код: Выделить всё
Option Explicit
'Base64:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Public Function Encode(ByVal iStr As String) As String
  Dim iXml As New MSXML2.DOMDocument30
  Dim iArray() As Byte

   With iXml.createElement("Encoder")
      .dataType = "bin.base64"
      ReDim iArray(LenB(iStr))
      CopyMemory iArray(0), ByVal StrPtr(iStr), LenB(iStr)

      .nodeTypedValue = iArray()
      Encode = .Text
  End With
End Function

Public Function Decode(ByVal iStrbase64 As String) As Byte()
  Dim strXML As String

  strXML = "<DECODER xmlns:dt=" & Chr(34) & "urn:schemas-microsoft-com:datatypes" & Chr(34) & " dt:dt=" & Chr(34) & "bin.base64" & Chr(34) & ">" & iStrbase64 & "</DECODER>"
  With New MSXML2.DOMDocument30
    .loadXML strXML
    Decode = .selectSingleNode("DECODER").nodeTypedValue
  End With   
End Function


в поиске здесь нашёл лишь похожие случаи с HTML, но без примеров...

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 14:09
Rojohn
Но теперь возник вопрос, а как представить картинку в виде текста :?: В каком формате они записаны (Юникоде?) :?:
Наверное надо различать что читаешь, .jpg или .bmp, но подозреваю, что формат картинки надо учитывать только при сохранении (декодировании)... И вообще, есть разница в моём случае, в каком формате кодировать? Неужели Base64 намного сожмёт формат JPG??? Я склонен вообще отказаться от всего этого и передавать ссылку и картинку как есть...

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 14:12
Rojohn
FireFenix писал(а):Ну переносим данные с аксеса в оракл и картинку храним в оракле в поле с типом blob...


Кстати, а в каком формате хранится картинка в поле blob :?: Наверное в виде массива двоичных данных :?: Тогда к предыдущим вопросам уточнение: как представить картинку (bmp, jpg) в виде строки двоичных данных :?:

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 15:02
FireFenix
Rojohn писал(а):
FireFenix писал(а):Ну переносим данные с аксеса в оракл и картинку храним в оракле в поле с типом blob...


Кстати, а в каком формате хранится картинка в поле blob :?: Наверное в виде массива двоичных данных :?: Тогда к предыдущим вопросам уточнение: как представить картинку (bmp, jpg) в виде строки двоичных данных :?:

какая платформа?

.net - http://www.codeproject.com/KB/recipes/I ... erter.aspx
vb6 - http://stackoverflow.com/questions/2792 ... ray-in-vb6

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 15:34
Rojohn
А без контейнера для картинок никак нельзя? И это ведь только для BMP, а другие форматы (jpg нужен обязательно)?
Вообще я не совсем корректно задал вопрос перед этим: байтовый массив мне не подойдёт - его не передашь в файле XML. Нужно представить картинку в таком виде, чтобы она могла быть размещена в инструкции <![CDATA[]]>.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 15:50
Antonariy
Это вы не в ту степь свернули.
Код: Выделить всё
Set rs = New ADODB.Recordset
rs.Fields.Append "Photo", adVarBinary
rs.Open
rs.AddNew
rs(0).Value = ReadFileBinary("c:\photo.jpg") 'читаем как байтовый массив
set doc = New DomDocoment
rs.Save doc, adPersistXML
debug.print doc.xml

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 15:55
Antonariy
Неужели Base64 намного сожмёт формат JPG???
Base64 ничего сжать не может, только увеличить. Грубо — один нечитаемый символ заменяется двумя читаемыми.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 16:11
Rojohn
Не могу проверить, пока не пойму, как грамотно реализовать ReadFileBinary!
В представленном выше примере читается только .bmp в битовый массив, да и то только из контейнера на форме. А нужно .jpg и .bmp из файла.
Попробую "поколдовать" с .bmp пока что...

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 16:34
Antonariy
Не могу проверить, пока не пойму, как грамотно реализовать ReadFileBinary!
Жесть.

Код: Выделить всё
Public Function ReadFile(path As String) As Byte()
Dim r() As Byte
    Open path For Binary As #1
    ReDim r(LOF(1) - 1)
    Get #1, , r
    Close #1
    ReadFile = r
End Function

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 14.01.2010 (Чт) 17:19
Rojohn
А я думал там как-то по-другому, эксклюзивно для картинок:)
Вот сделал - ругается на строчку
rs.Fields.Append "Photo", adVarBinary
скорее всего такой тип не работает для рекордсета почему-то... :?

Код: Выделить всё
Private Sub Command1_Click()
  Dim rs As ADODB.Recordset, doc As XMLDocument

  Set rs = New ADODB.Recordset
  rs.Fields.Append "Photo", adVarBinary
  rs.Open
  rs.AddNew
  rs(0).Value = ReadFileBinary("c:\5.bmp") 'читаем как байтовый массив
  Set doc = New DOMDocument
  rs.Save doc, adPersistXML
  MsgBox doc.xml
End Sub


Ошибка на строке rs.Fields.Append "Photo", adVarBinary:
"Run-time error '3001' Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом."

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 10:28
Хакер
[offtopic]Интересно, а что будут через 10 лет впихивать в XML? Наверное HD-фильмы...[/offtopic]

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 10:41
Antonariy
Нужно размер поля указать. Можно указать с запасом, а можно сделать так:
Код: Выделить всё
Dim r() as Byte
r = ReadFileBinary("c:\5.bmp")
rs.Fields.Append "Photo", adVarBinary, UBound(r)+1
Интересно, а что будут через 10 лет впихивать в XML? Наверное HD-фильмы...
Кстати о птичках. Автор, имей ввиду, что при сохранении файла в xml этим способом его размер увеличится ровно в два раза. При использовании Base64 — раза в полтора, но заметно увеличится время конвертации. Решай, что тебе важнее.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 11:16
Rojohn
Эта ошибка исчезла, но теперь картинка не помещается в байтовый массив:
Код: Выделить всё
Dim r1() As Byte
 
  Open path For Binary As #1
  ReDim r1(LOF(1) - 1) 'Здесь размерность массива выходит за рамки


По поводу решения: решать будет архитектор проекта, моя задача предъявить варианты...
Кстати, надо ещё посмотреть, как оно будет выглядеть в теле XML!

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 12:00
Antonariy
Хакер был прав. Это что же за картинки, что двухсот сорока мегабайт мало? Раровский архив размером 48,5 мегабайт через ReadFile всосался со свистом.
Но можно и без массивов.
Код: Выделить всё
Dim rs As New ADODB.Recordset
Dim st As New ADODB.Stream
st.Type = adTypeBinary
st.Open
st.LoadFromFile "c:\Photo.jpg"
rs.Fields.Append "Photo", adVarBinary, st.Size
rs.Open
rs.AddNew
rs(0).Value = st.Read
Однако мне начинает надоедать отвечать на детские вопросы, не имеющие отношения к тематике форума. :(
Включай уже голову.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 12:39
Rojohn
Вообще-то картинка всего 438 КБ (BMP), так что дело не в размере наверное.
В новом способе опять таже ошибка на той же строчке :?

rs.Fields.Append "Photo", adVarBinary, st.Size

Кто-то спрашивал про версию - у меня vb6.0 и на NET пока переходить нельзя, т.к. техника во многих регионах слабовата. Но в будущем возможно перейдём...

Почему не по теме форума? Ведь представление картинки как строки чего-либо, годного для помещения в XML - это часть вопроса по размещению картинки (фото) в XML...

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 13:03
Antonariy
Не по теме, как считать бинарно файл, не по теме, почему файл не лезет в массив.

Тема — как передать байтовый массив через XML. Решение — преобразовать байты в набор символов, допустимых в значении узла. XML допускает все читаемые символы за исключением "<", ">" и "&" — они служебные. Мы рассмотрели две реализации — Base64 и HEX. Я предоствавил способ конвертации в HEX называемый "для ленивых", почему код, проверенный мной в Form_Load на сорокамеговом файле, не работает именно в твоих руках, вопрос не этого форума и мне не интересен. Можешь придумать свой. Концептуальное же решение твоей задачи представлено во втором предложении этого абзаца.

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 13:14
Rojohn
Хорошо, спасибо! Буду пытаться...
А на какой версии тестировался последний пример? Кстати, от моих рук в данном случае, как я понимаю, зависела только полнота копирования. Утверждаю, что при этом процессе потерь и извращений кода примера с моей стороны не было. Разница только в том, что он выполняется не в FORM_LOAD, а по кнопке (Private Sub Command1_Click()).

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 15.01.2010 (Пт) 13:58
Rojohn
Короче, вроде как-то заработала! Видать кривая была картинка...
Выдаёт кучу знаков вопроса или два вопроса + квадрат (NULL в st.Read). Это нормально :?:

А вот первый способ (с массивом) выдаёт нормальные символы... Чёт не так с потоками наверное?

Re: Передача фотографий в XML или ему подобном

СообщениеДобавлено: 16.01.2010 (Сб) 15:42
Antonariy
Лучше выложи пример с нужным файлом, чтобы не гадать.
ADODB использовался версии 2.8

Пример с потоками

СообщениеДобавлено: 18.01.2010 (Пн) 12:09
Rojohn
Выкладываю, но ничего нового там нет (специально сделал отдельный проект с примером)...
Example.rar
Пример для Antonariy...
(522.96 Кб) Скачиваний: 220