Ich m�chte irgendwelche Dateien die auf der Festplatte sind, z.B. pdf-
Dateien, in das Base64 Format konvertieren. Dabei herauskommen
soll ein String und den m�chte ich in einer Access-Tabelle speichern
z.B. in ein Memo-Feld.
Anders herum m�chte ich aus diesen Base64-Strings nachher wieder
g�ltige(!) Dateien auf der Festplatte erzeugen.
Es mu� wohl unbedingt Base64 sein weil ich Daten von einer Beh�rde
bekomme bei denen das bereits so verschl�sselt ist.
Ich habe zwar schon eine Reihe von Base64-Funktionen f�r Access
gefunden, z.B. das hier:
http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Base64-Kodierung
aber genau das oben beschriebene mit den Dateien leider
nicht. Hat dazu schon jemand etwas Fertiges gemacht?
Ich stelle mir so etwas vor wie:
=ConvertToBase64(strDateiname)
ConvertToDatei(strBase64)
Gru�,
Christian Nennewitz
> Ich mᅵchte irgendwelche Dateien die auf der Festplatte sind, z.B. pdf-
> Dateien, in das Base64 Format konvertieren. Dabei herauskommen
> soll ein String und den mᅵchte ich in einer Access-Tabelle speichern
> z.B. in ein Memo-Feld.
www.donkarl.com?FAQ2.2 kennst du, speziell die 2. Variante? Dies
Vorgehen lᅵsst sich auf alle Arten von Dateien anwenden.
Eine Codierung in ein bestimmtes Format ist dabei m.E. nicht notwendig,
da du den Inhalt nicht interpretieren musst. Wichtig wᅵre das, wenn eine
Gegenstelle wie z.B. ein Webservice Base64 erwartet.
Beachte aber auch, dass eine Access-Datenbank maximal 2 GB groᅵ werden
kann! Endlos viele Dateien wirst du also nicht ablegen kᅵnnen.
Viele Grᅵᅵe aus Bremen,
Stefan
> www.donkarl.com?FAQ2.2 kennst du, speziell die 2. Variante? Dies Vorgehen
> l�sst sich auf alle Arten von Dateien anwenden.
Danke f�r den Hinweis. Ich mu� aber leider zwingend mit
Bin�rdaten im Base64-Format umgehen k�nnen.
Gru�,
Christian Nennewitz
> Danke fᅵr den Hinweis. Ich muᅵ aber leider zwingend mit
> Binᅵrdaten im Base64-Format umgehen kᅵnnen.
Fᅵr das Speichern in der Datenbank ist es vᅵllig egal, welches Format
die Datei hat. Da du die Inhalte nicht weiterverarbeitest, sondern nur
von der Festplatte binᅵr in eine Tabelle speicherst und dann wieder
binᅵr dorthin zurᅵckschreibst, macht es keinen Unterschied ob Base64 o.ᅵ.
Und deiner Ausgangsfrage entnehme ich, dass diese Daten bereits Base64
codiert vorliegen. Da wᅵre eine nochmalige Codierung auch Mumpitz.
Versuche doch einfach mal, mit den in der F.A.Q. beschriebenen Methode,
eine Datei zwischenzuspeichern und dann wieder herzustellen. Klappt das?
Viele Grᅵᅵe aus Bremen,
Stefan
P.S.: Es korrigiere mich jemand, wenn ich ganz groᅵen Mist erzᅵhle.
> Und deiner Ausgangsfrage entnehme ich, dass diese Daten bereits Base64
> codiert vorliegen. Da w�re eine nochmalige Codierung auch Mumpitz.
Ich glaube ich habe das etwas zu ungenau formuliert.
Ich habe eine XML-Datei mit irgendwelchen Daten, die
ich in Access einlese. Bei diesen Daten k�nnen auch
Base64 verschl�sselte PDF-Dateien dabei sein. D.h. ich
ben�tige eine Funktion mit der man diese Base64-
Zeichenketten wieder entschl�sseln kann.
Andersherum, wenn ich aus meinen Access-Daten wieder
eine XML-Datei erzeugen m�chte, mu� ich meine evtl.
erzeugten PDF-Dateien auch wieder ins Base64-Format
konvertieren weil der Empf�nger sonst nichts damit an-
fangen kann.
Es gibt ja auch offenbar die M�glichkeit dieses zu tun, leider
habe ich noch nichts f�r Access gefunden, da� sich einfach
verwenden lie�e.
Das man Bin�rdaten generell in Access speichern kann be-
zweifle ich ja nicht. Aber das n�tzt mir in diesem Falle wenig.
Gru�,
Christian
Ich habe mittlerweile hier
http://www.f2ko.de/Deutsch/index.php
ein Programm von Fatih Kodak gefunden, mit
dem man Base64 Daten aus einer Datei
erzeugen kann und umgekehrt.
Ich denke mal das m��te man mit einem
Shell-Aufruf auch in Access einbauen
k�nnen.
Ein Klassenmodul oder ein normales Modul
w�re mir zwar lieber aber ich denke ich
komme damit hin.
Gru�,
Christian
Christian Nennewitz schrieb:
> Ein Klassenmodul oder ein normales Modul
> w�re mir zwar lieber aber ich denke ich
> komme damit hin.
eine kurze Suche nach "base64 binary vba" brachte mich zu dieser
Seiten: http://www.vbforums.com/showthread.php?t=379072
Damit kann man Strings konvertieren.
Wenn du dann den erhaltenen String mit Put als Datei speicherst,
m�sste die PDF eigentlich funktionsf�hig sein.
(Ausprobiert habe ich den Code allerdings nicht.)
mfg
Josef
Christian Nennewitz wrote:
> Es gibt ja auch offenbar die M�glichkeit dieses zu tun, leider
> habe ich noch nichts f�r Access gefunden, da� sich einfach
> verwenden lie�e.
Schau mal hier:
http://www.dbwiki.de/wiki.php?title=Access_Beispieldatenbanken
Da kannst Du eine DB mit einem Klassenmodul zur
Base64-Kodierung/-Dekodierung finden.
--
Gruss
Jens
Vielen Dank f�r Eure Hinweise. Tats�chlich habe
ich auch einen Haufen Beispiele gefunden mit denen
man Strings in Base64 und umgekehrt konvertieren
kann.
Leider fehlt mir aber das Wissen, wie man dies
auf Dateien anwendet.
Wenn ich z.B. eine Bin�r Datei einlesen und als String
speichern m�chte. Wie macht man denn das? Und zwar
so, da� dabei keine Daten verloren gehen?
Ich werde es mal, wie Josef geschrieben hat, mit Put
und Get versuchen. Leider bin ich kein Experte was
das verarbeiten von Bin�rdateien betrifft. Bisher hatte
ich immer nur mit "normalen" Textdateien zu tun.
Gru�,
Christian Nennewitz
"Christian Nennewitz" <Nenn...@dej.de> wrote in message
news:hs0ah2$mlj$1...@online.de...
> Wenn ich z.B. eine Bin�r Datei einlesen und als String
> speichern m�chte. Wie macht man denn das? Und zwar
> so, da� dabei keine Daten verloren gehen?
Ich habe zwei Funktionen, die von und nach Base64 konvertieren k�nnen.
Jene, die Base64 dekodiert habe ich in Verwendung, die nach Base64
konvertiert habe ich noch nie ben�tigt, und daher �berhaupt nicht getestet.
Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir diese
Funktion samt drumherum an und poste sie hier.
Gr��e aus Wien,
Wolfgang
> Ich habe zwei Funktionen, die von und nach Base64 konvertieren k�nnen.
> Jene, die Base64 dekodiert habe ich in Verwendung, die nach Base64
> konvertiert habe ich noch nie ben�tigt, und daher �berhaupt nicht
> getestet.
> Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir
> diese
> Funktion samt drumherum an und poste sie hier.
Das h�rt sich ja richtig gut an. W�rde mich ja schon mal interessieren,
wie Du das machst. Ist aber eigentlich nicht mehr n�tigt. Ich habe es
mittlerweile mit einer externen Datei "Base64.exe"* gel�st, die ich mit
WaitShell aufrufe und dann die erzeugten Daten wieder in Access einlese.
Trotzdem vielen Dank f�r Deine angebotene Hilfe.
Gru�,
Christian Nennewitz
*
http://www.f2ko.de/Deutsch/index.php
>> Falls Du noch Bedarf hast, bitte hier mitzuteilen, dann schaue ich mir
>> diese
>> Funktion samt drumherum an und poste sie hier.
>
> Das h�rt sich ja richtig gut an. W�rde mich ja schon mal interessieren,
Ich hatte leider nicht sofort Zeit, eine Testumgebung f�r die Routinen zu
schreiben, deshalb erst jetzt den Code:
Option Explicit
Option Compare Database
' Konstante f�r En- und Decode Base64
Public encodeArr(64) As String * 1
Public decodeArr(255) As Byte
Public Const EncChars = _
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"abcdefghijklmnopqrstuvwxyz" & _
"0123456789+/"
' Base64-Tabellen erzeugen
Sub Base64_Init()
Dim i As Long
Dim ch As String
Dim iFileNummer As Integer
Dim lX As Long
For i = 0 To 255: decodeArr(i) = 0: Next i ' l�schen Tabelle decodeArr
For i = 1 To Len(EncChars) ' 1-64
ch = Mid(EncChars, i, 1)
encodeArr(i - 1) = ch ' encodeArr(Laufindex-1) = Zeichen
decodeArr(Asc(ch)) = i - 1 ' decodeArr(mit dem Wert von Zeichen) =
Laufindex-1
Next i
End Sub
' string in Base64 encodieren
Function Base64_Encode(strIn As String) As String
Dim strOut As String, a(2) As Byte
Dim N0 As Long, N1 As Long, N2 As Long, N3 As Long
Dim Ausg As Long, i As Long, j As Long
strOut = ""
i = 1: Ausg = 3
Do While i <= Len(strIn)
For j = 0 To 2
If i <= Len(strIn) Then
a(j) = Asc(Mid(strIn, i, 1)): i = i + 1
Else
a(j) = 0: Ausg = Ausg - 1
End If
Next j
N0 = (a(0) \ 4) And &H3F
N1 = ((a(0) * 16) And &H30) + ((a(1) \ 16) And &HF)
N2 = ((a(1) * 4) And &H3C) + ((a(2) \ 64) And &H3)
N3 = a(2) And &H3F
strOut = strOut & encodeArr(N0) & encodeArr(N1) & _
IIf(Ausg > 1, encodeArr(N2), "=") & IIf(Ausg > 2, encodeArr(N3), "=")
Loop
Base64_Encode = strOut
End Function
' string aus Base64 decodieren
' aus http://www.dbwiki.de/wiki.php?title=VBA_Tipp:_Base64-Kodierung
Function Base64_Decode(strIn As String) As String
Dim strOut As String
Dim A0 As Long, A1 As Long, A2 As Long, A3 As Long
Dim B0 As Long, B1 As Long, B2 As Long, B3 As Long
Dim i As Long
strOut = ""
For i = 1 To Len(strIn) - 3 Step 4
B0 = Asc(Mid$(strIn, i, 1)): A0 = decodeArr(B0)
B1 = Asc(Mid$(strIn, i + 1, 1)): A1 = decodeArr(B1)
B2 = Asc(Mid$(strIn, i + 2, 1)): A2 = decodeArr(B2)
B3 = Asc(Mid$(strIn, i + 3, 1)): A3 = decodeArr(B3)
strOut = strOut & Chr(((A0 * 4) Or (A1 \ 16)) And &HFF)
If B2 <> Asc("=") Then strOut = strOut & Chr(((A1 * 16) Or (A2 \ 4)) And
&HFF)
If B3 <> Asc("=") Then strOut = strOut & Chr(((A2 * 64) Or A3) And &HFF)
Next i
Base64_Decode = strOut
End Function
' File encodieren
Sub EncodeBase64()
On Error Resume Next
Const BufLen As Integer = 57
Dim Filenumbin As Integer
Dim Filenumtxt As Integer
Dim str As String
Dim FileLenBin As Long
Base64_Init
Filenumbin = FreeFile()
Open "D:\DATEN\EMail\003225_001_Mail_10_001_inv_9266074336_635764606.pdf"
For Binary As Filenumbin
FileLenBin = LOF(Filenumbin)
Filenumtxt = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.txt" For Output As Filenumtxt
Do While Not EOF(Filenumbin)
If FileLenBin > BufLen Then str = String(BufLen, 0) Else str =
String(FileLenBin, 0)
Get Filenumbin, , str
Print #Filenumtxt, Base64_Encode(str)
FileLenBin = FileLenBin - Len(str)
If FileLenBin <= 0 Then Exit Do
Loop
Close
End Sub
' File decodieren
Sub DecodeBase64()
On Error Resume Next
Dim Filenumbin As Integer
Dim Filenumtxt As Integer
Dim str As String
Base64_Init
Filenumtxt = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.txt" For Input As Filenumtxt
Kill ("D:\TEMP\inv_9266074336_635764606.pdf")
Filenumbin = FreeFile()
Open "D:\Temp\inv_9266074336_635764606.pdf" For Binary As Filenumbin
Line Input #Filenumtxt, str
Do While Not EOF(Filenumtxt)
If Len(str) > 0 Then Put Filenumbin, , Base64_Decode(str)
Line Input #Filenumtxt, str
Loop
Close
End Sub
Du mu�t nat�rlich die Dateinamen �ndern.
Ich m�chte noch erw�hnen, da� auch mittels des Objektes "CDO.Message"
De- und Encodierung vorgenommen werden kann.
Mit Gru� aus Wien,
Wolfgang
Vielen Dank f�r den Code. Ich glaube da kann ich noch
das ein- oder andere daraus lernen.
Viele Gr��e,
Christian Nennewitz
ausgangssituation:
ich habe einen soap envelope der mit eine base64 encodierte pdf als
string �bergibt
diesen base64 string mu� ich wieder zu binary kriegen und habe dies mit
nachstehender funktion versucht
dazu schreibe ich den base64 string in eine textdatei
dim vsource as string
vsource = "d:\test.txt"
dim vtarget as string
vtarget = "d:\test.pdf"
d.h. der string wird in die vsource geschrieben was auch funktioniert
nun habe ich nachstehenden code so ge�ndert dass er als parameter
vsource und vtarget �bergeben bekommt und die jeweiligen .txt und .pdf
strings im code durch vsource und vtarget ersetzt
wenn ich den code laufen lasse springt er mit allerdings in der do while
schleife raus, d.h. filenumtxt ist EOF
und auch str scheint "" zu sein
wo liegt der fehler ?
danke
Gerhard
"Gerhard" <deve...@it-creations.com> schrieb im Newsbeitrag
news:j0s99p$67f$1...@news.albasani.net...
> hallo,
> ich habe ein problem mit nachstehendem code
>
> ausgangssituation:
>
> ich habe einen soap envelope der mit eine base64 encodierte pdf als string
> �bergibt
>
> diesen base64 string muďż˝ ich wieder zu binary kriegen und habe dies mit
> nachstehender funktion versucht
>
> dazu schreibe ich den base64 string in eine textdatei
>
> dim vsource as string
> vsource = "d:\test.txt"
>
> dim vtarget as string
> vtarget = "d:\test.pdf"
>
> d.h. der string wird in die vsource geschrieben was auch funktioniert
>
> nun habe ich nachstehenden code so ge�ndert dass er als parameter vsource
> und vtarget �bergeben bekommt und die jeweiligen .txt und .pdf strings im
So trifft man sich wieder!
1. Wird in die Do While Schleife �berhaupt verzeweigt?
2. Enth�lt D:\Temp\inv_9266074336_635764606.txt Daten mit Zeilenwechsel,
oder ist der File vielleicht leer?
3. Kannst Du einige Zeilen posten?
Du kannst mir den Textfile senden, falls Du nicht weiterkommst.
Wolfgang