Golang io.copy zweimal auf dem Anfragetext

8

Ich baue ein Blob-Speichersystem und ich wählte Go als Programmiersprache. Ich erstelle einen Stream, um eine mehrteilige Datei vom Client auf den Blob-Server hochzuladen.

Der Stream funktioniert einwandfrei, aber ich möchte aus dem Anfragetext einen sha1-Hash machen. Ich muss io.Copy den Körper zweimal. Der sha1 wird erstellt, aber die mehrteiligen Ströme 0 Bytes danach.

  1. Zum Erstellen des Hashs
  2. Zum Streaming des Körpers als multipart

irgendeine Idee, wie ich das tun kann?

der Client hochladen

%Vor%

die sha1 Funktion

%Vor%

}

Upload-Handle

%Vor%

}

    
Anthony De Meulemeester 04.09.2014, 17:10
quelle

3 Antworten

11

Sie können das nicht direkt tun, aber Sie können einen Wrapper schreiben, der das Hashing auf io.Copy durchführt

%Vor%

// aktualisierte Version basierend auf @ Dustins Kommentar, da ich vergessen habe io.TeeReader existierte.

%Vor%     
OneOfOne 04.09.2014, 17:32
quelle
18

Ich würde vorschlagen, ein io.TeeReader zu verwenden, wenn Sie alle Lesevorgänge vom Blob gleichzeitig durch den sha1 schieben möchten .

%Vor%

Jetzt, da der bodyReader während des Uploads verbraucht wird, wird der Hash automatisch aktualisiert.

    
JimB 04.09.2014 17:35
quelle
1

Sie haben zwei Möglichkeiten.

Der direkteste Weg ist die Verwendung von io.MultiWriter .

Aber wenn Sie den Hash benötigen, um die mehrteilige Ausgabe zu erzeugen, dann müssen Sie zu einem bytes.Buffer kopieren und dann den Puffer zurück zu jedem Schreiber schreiben.

    
andlabs 04.09.2014 17:32
quelle

Tags und Links