2016-04-07 3 views
0

ich lade Bild in PostgreSQL mit folgendem Befehl ein:Wie binäre Blob aus PostgreSQL mit D laden/entladen?

UPDATE "USERS" SET userblob = (pg_read_binary_file('img.png')::bytea) WHERE id>1; 

Der Feldtyp ist: bytea

Jetzt DB wie this.

Dann habe ich versucht, binäre Blob zurück in das Dateisystem zu schreiben. Und habe sehr große Datei, die Daten wie enthalten: [56, 57, 53, 48, 52, 101, 52, 55, 48, 100, 48, 97, 49 ...

Was mache ich falsch? Mein Code ist der nächste:

struct MyData 
{ 
    string guid; 
    string id; 
    string name; 
    byte [] userblob; 
    string fl; 
} 
     auto rs = pgstmt.executeQuery(`SELECT guid::text, id, name, userblob, "FL" FROM "USERS" where "FL" = 10;`); 
    while (rs.next()) 
    { 
     md.guid = to!string(rs.getString(1)); 
     md.id = to!string(rs.getString(2)); 
     md.name = to!string(rs.getString(3)); 
     md.userblob = rs.getBytes(4); 
     md.fl = to!string(rs.getBytes(5)); 

     std.file.write("output.png", cast(byte[])md.userblob); 
     readln; 

     mydata ~= md; 
    } 

UPD: Ich habe Dokumente gelesen. PostgreSQL-Bytea ist Schmerz. Es ist viel besser, den gesamten Text in der base64-Codierung zu speichern. Arbeitsbeispiel: UPDATE "USERS" SET userblob = encode(pg_read_binary_file('img.png'), 'base64') WHERE id>1;

+0

Welchen Client-Treiber verwenden Sie? Der Client-Treiber sollte sich darum kümmern. PgJDBC tut, psqlODBC tut, libpq tut ... benutzen Sie einen wirklich begrenzten Treiber? –

Antwort

1

Es gab ein Problem in bytea Kodierung/Dekodierung Funktion. Fest in ddbc v0.2.32

0

Die Postgres bytea scheint hier die Ursache des Problems zu sein. Von dem, was ich in den Postgres-Dokumenten lesen konnte, speichert Bytea nicht druckbare Werte des Bytestroms als die Zeichenfolgendarstellung des Oktalwerts dieses Werts. Dies erfordert einige Verarbeitung, um den tatsächlichen binären Stream zurück zu bekommen ...

Sie können einen Blick darauf werfen, wie DDBC diese behandelt.

Ich würde vorschlagen, Sie copy/paste die byte[] byteaToBytes(string s) Funktion in einem Ihrer Projektdatei und Ihren Code anzupassen, wie folgt:

while (rs.next()) 
{ 
    ... 
    md.userblob = byteaToBytes(to!string(rs.getString(4))); 
    ... 
    std.file.write("output.png", cast(byte[])md.userblob); 
    readln; 

    mydata ~= md; 
} 
+0

'' ' \t \t byte [] userblob; \t \t ... \t \t md.userblob = rs.byteaToBytes (4); \t \t Fehler: keine Eigenschaft 'byteaToBytes Typ 'ddbc.core.ResultSet' \t \t '' ' –

+0

Gibt es einen Grund, warum Postgres nicht speichern Bytes direkt? Warum konvertieren sie sie in inneres Format? –

+0

es sieht aus wie etwas immer noch falsch. Ich kann das Originalbild nicht erhalten http://img.ctrlv.in/img/16/04/07/57063cd3dc645.png –

Verwandte Themen