Rojohn писал(а):Всё не так: есть клиент на Access и VD, который хранит фото не в базе, а в папке. Из него делается выгрузка в Oracle и надо передать картинки, чтобы они попали в базу Oracle.
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
FireFenix писал(а):Ну переносим данные с аксеса в оракл и картинку храним в оракле в поле с типом blob...
Rojohn писал(а):FireFenix писал(а):Ну переносим данные с аксеса в оракл и картинку храним в оракле в поле с типом blob...
Кстати, а в каком формате хранится картинка в поле blob Наверное в виде массива двоичных данных Тогда к предыдущим вопросам уточнение: как представить картинку (bmp, jpg) в виде строки двоичных данных
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
Base64 ничего сжать не может, только увеличить. Грубо — один нечитаемый символ заменяется двумя читаемыми.Неужели Base64 намного сожмёт формат JPG???
Жесть.Не могу проверить, пока не пойму, как грамотно реализовать 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
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
Dim r() as Byte
r = ReadFileBinary("c:\5.bmp")
rs.Fields.Append "Photo", adVarBinary, UBound(r)+1
Кстати о птичках. Автор, имей ввиду, что при сохранении файла в xml этим способом его размер увеличится ровно в два раза. При использовании Base64 — раза в полтора, но заметно увеличится время конвертации. Решай, что тебе важнее.Интересно, а что будут через 10 лет впихивать в XML? Наверное HD-фильмы...
Dim r1() As Byte
Open path For Binary As #1
ReDim r1(LOF(1) - 1) 'Здесь размерность массива выходит за рамки
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
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7