Dateiimport mit bytea

Guten Morgen,
ein Monat ist verstrichen, Urlaub, andere Aufgaben, ... Aber ich bin jetzt etwas weiter, habe Zugang zu dem Data directory, folglich kann ich nun wohl auch wirklich Dateien in die Datenbank importieren via INSERT INTO ... bytea usw.
Nun schrieb castorp:
Wenn Du die Dateien auf dem Client "öffnen" willst, musst Du die Binärdaten via SQL lesen und lokal als Datei abspeichern. Dann kann Deine Anwendung die Datei öffnen. Du musst natürlich dafür sorgen, dass diese lokale Kopie auch nach dem Schliessen der Datei wieder gelöscht wird.
Also, wenn ich nun einem User, der keinen Zugriff auf das Data directory hat, Zugriff zu einer in der Datenbank gespeicherten Datei gewähren will - er soll z. B. eine PDF-Datei öffnen, die in der Datenbank liegt, oder ein Bild öffnen oder was auch immer - wie lese ich die Binärdaten via SQL und speichere sie lokal ab?
Optimalerweise wäre ein VBA-Tipp Klasse, aber sonst zumindest die Idee für Fortgeschrittene, aber nicht Vollprofis beschrieben ;-)
Vielen vielen Dank schon im Voraus!
 
Werbung:
Naja, Du musst halt via SELECT die Daten lesen, sowas wie select doc from document where id = 42 und dann via VBA das Resultat verarbeiten und die Daten aus der Spalte lokal speichern. Allerdings habe ich null Ahnung von VBA.
 
Ok, die Idee habe ich prinzipiell verstanden, danke castorp!
Vielleicht liest das hier noch ein VBAler, ansonsten werde ich fleißig googeln und selbst etwas rumdoktern. Ich hoffe dann mal selbst hier die Lösung zu posten und das Thema abzuschließen.
 
Guten Morgen Castorp,

ein erfahrender VBA-Programmierer konnte mir tatsächlich weiterhelfen, bin echt dankbar! Für den Fall, dass jemand hierüber stolpert und auch eine Lösung sucht, hier schon mal, was in VBA hilft (durch mich soweit vervollständigt, mit SELECT kombiniert usw.):

Code:
Dim ByteArray() As Byte
    'ByteArray dann befüllen aus deiner Datenbank // Pfad entsprechend dem gewünschten Zielpfad anpassen
    With Rcs
        .Open ("SELECT * FROM meinschema.meinetabelle " & _
            "WHERE jpgname = 'DieDatei'"), Cnn, adOpenDynamic, adLockOptimistic
        ByteArray = .Fields("MeinByteaFeld").Value
        .Close
    End With
    Set Rcs = Nothing
    Open "C:\MeinPfad\DieDatei.jpg" For Binary Lock Read Write As #1
    Put #1, , ByteArray
    Close #1

Allerdings wird in dem Pfad eine Datei (im richtigen Format oder zumindest mit der richtigen Endung) gespeichert, die aber nur 1KB groß ist, in dem Fall jpg. Dass das nicht das ist, was ich eigentich gehofft hatte abgelegt zu haben, ist klar.

Nun weiß ich noch nicht, ob der Dateiimport in die Postgres-Datenbank noch nicht richtig funktioniert oder ich die Export-Lösung nicht ganz korrekt umsetze.

Wie kann ich prüfen, was in der bytea-Spalte in Postgres tatsächlich liegt? Ich kann den dort gespeicherten Inhalt (hoffentlich eben eine Datei) nicht einfach öffnen. Gedacht hatte ich schon daran zumindest erstmal die Größe der Datei zu prüfen, habe dafür über pgAdmin folgendes ausprobiert:
SQL:
select namensfeld, length(byteafeld) as filesize from meinschema.meinetabelle
Als filesize bekomme ich dann einen Integer-Wert von 40. Ehrlich gesagt, weiß ich nun leider nicht wirklich, was ich mit diesem Ergebnis anfangen soll.

Vielleicht kommt zur Wochenendvorfreue die noch wertvollere Freude das endgültig zu lösen dazu. Tausend Dank für Deine/Eure Geduld und Unterstützung!
 
Vielleich eben noch ergänzend, wie ich schlussendlich die Dateien per VBA in Postgres importiere:
Code:
cnn.Execute "INSERT INTO meinschema.meinetabelle VALUES('DieDatei.jpg', bytea('/MeinServerPfad/DieDatei.jpg'))"
Ohne cnn.Execute dann logischerweise auch über den pgAdmin-Editor gleichermaßen. Reicht das? Kommt damit wirklich die Datei an?
 
Damit passiert letztendlich dies:

Code:
postgres=# select bytea('/MeinServerPfad/MeineDatei.jpg');
                             bytea                              
----------------------------------------------------------------
 \x2f4d65696e536572766572506661642f4d65696e6544617465692e6a7067
(1 row)

Exakt dies wird nun in Deiner Tabelle stehen - nicht aber der INHALT der Datei auf diesem Pfad.
 
Hi akretschmer,
also hab ich den Import immer noch nicht raus :-(
Du hattest schon mal auf einen Post von dir verwiesen, womit ich nicht ganz so gut zurechtkam. Aber inzwischen bin ich ja deutlich weiter. Daher meine Bitte nochmals: Wie kann ich denn nun, jetzt wo ich die Dateien auf dem Server habe, auf dem auch Postgres läuft, die Dateien importieren? Wie muss meine INSERT-Zeile, oder was für ein Code auch immer nötig ist, aussehen?
 
Dann kommt bei mir:

ERROR: FEHLER: konnte »stat« für Datei »/MeinServerPfad/MeineDatei.jpg« nicht ausführen: Datei oder Verzeichnis nicht gefunden
SQL state: 58P01

Na ja, wenn ich die Fehlermeldung so wörtlich nehmen kann "Datei oder Verzeichnis nicht gefunden", dann muss ich doch noch mal mit unserer IT sprechen 🤔
 
Code:
test=*# select pg_read_binary_file('/tmp/test.txt');
  pg_read_binary_file   
------------------------
 \x626c6120666173656c0a
(1 row)

test=*# select encode(pg_read_binary_file('/tmp/test.txt'),'escape')::text;
  encode   
-----------
 bla fasel+
 
(1 row)

test=*# \! cat /tmp/test.txt
bla fasel
test=*#
 
Es gab tatsächlich noch ein "Verzeichnis-Missverständnis". Nachdem das ausgeräumt war, läuft es jetzt!
Ich kann gar nicht oft genug "DANKE" sagen! Trotzdem: DANKE, DANKE, DANKE, DANKE, DANKE, ...
Schön, dass es Menschen gibt, die fachlich kompetent und hilfsbereit sind, wie Ihr hier im Forum 🤝
Allen ein schönes Wochenende!
 
Guten Morgen zusammen,

nachdem ich das Thema abgeschlossen glaubte... Auch wenn das alles so funktioniert, haben wir diesen kleinen manuellen Umweg, auf dem ich meine Dateien mit Adminrechten zunächst von einem Verzeichnis auf den Server, auf dem auch Postgres läuft, kopieren muss, um erst von diesem Zeitpunkt an alle weiteren Schritte mit Up- und Download etc. via VBA und SQL lösen zu können. Dieser manuelle Umweg bzw. Zwischenschritt ist unserer IT noch ein kleiner Dorn im Auge.

Könnt ihr mir bitte sagen, ob es möglich ist den Datentransfer auf den Server oder direkt in die Datenbank über den/einen ODBC-Treiber durchzuführen? Erstmal generell und vielleicht mit einem kleinen Tipp ;-) Bin mir als Quereinsteiger und self made Datenbankentwickler in manchen Grunsatzfragen etwas unsicher, muss mich in viele Basics erst immer einlesen.

Besten Dank und einen guten Wochenstart!
 
Werbung:
Eher "postgresql bytea via odbc vba", aber natürlich habe ich schon gegoogelt. Ganz so faul bin ich nicht ;)
Ich glaube auch nach allem, was ich gelesen hatte, dass es wohl möglich ist, bin mir aber immer noch nicht ganz sicher. Zumal wir in den letzten Wochen, als wir bzw. viel mehr Ihr die Lösung erarbeitet hatten/hattet, das in der Form nicht in Betracht gezogen hatten. Oder aber ich habe das nicht erkannt oder nicht ausreichend hinterfragt. Daher eben meine generelle Frage, ob es möglich ist oder ob ich nach etwas suche, das es nicht gibt - Quereinsteiger, Basics fehlen, vieles erst einlesen, ...

Aber nach allem, was ich eben gelesen hatte, glaube ich fast, dass ich die Frage hier zurückziehen und eher bei VBA-lern platzieren muss, zumindest die Frage nach dem "Wie".
 
Zurück
Oben