Ich bin ein Blob Storage-System bauen und ich wählte Go als die Programmiersprache. Ich erstelle einen Stream, um einen mehrteiligen Datei-Upload vom Client zum Blob-Server durchzuführen.Golang io.copy zweimal auf der Anfrage Körper
Der Stream funktioniert gut, aber ich möchte einen sha1 Hash aus dem Anfragetext machen. Ich muss io.Copy den Körper zweimal. Der sha1 wird erstellt, aber die multipart Streams 0 Bytes danach.
- Für die Erstellung der Hash-
- Für den Körper als Multipart-Streaming
eine Ahnung, wie ich das tun kann?
der Client-Upload
func (c *Client) Upload(h *UploadHandle) (*PutResult, error) {
body, bodySize, err := h.Read()
if err != nil {
return nil, err
}
// Creating a sha1 hash from the bytes of body
dropRef, err := drop.Sha1FromReader(body)
if err != nil {
return nil, err
}
bodyReader, bodyWriter := io.Pipe()
writer := multipart.NewWriter(bodyWriter)
errChan := make(chan error, 1)
go func() {
defer bodyWriter.Close()
part, err := writer.CreateFormFile(dropRef, dropRef)
if err != nil {
errChan <- err
return
}
if _, err := io.Copy(part, body); err != nil {
errChan <- err
return
}
if err = writer.Close(); err != nil {
errChan <- err
}
}()
req, err := http.NewRequest("POST", c.Server+"/drops/upload", bodyReader)
req.Header.Add("Content-Type", writer.FormDataContentType())
resp, err := c.Do(req)
if err != nil {
return nil, err
}
.....
}
die SHA1 func
func Sha1FromReader(src io.Reader) (string, error) {
hash := sha1.New()
_, err := io.Copy(hash, src)
if err != nil {
return "", err
}
return hex.EncodeToString(hash.Sum(nil)), nil
}
Upload Griff
func (h *UploadHandle) Read() (io.Reader, int64, error) {
var b bytes.Buffer
hw := &Hasher{&b, sha1.New()}
n, err := io.Copy(hw, h.Contents)
if err != nil {
return nil, 0, err
}
return &b, n, nil
}
Ich habe es gemacht, thx zu @OneofOne zu arbeiten ich poste das Endergebnis später, als ich das Durcheinander aufräumte, machte ich –
Sie brauchen wirklich nicht so viel Code und Sie müssen sicher nicht eine ganze zusammenhängende Kopie von speichern dein Blob im RAM. Ich habe eine ähnliche Sache mit Multi-GB Blobs auf RAM ausgehungert Geräte ohne Problem gemacht. – Dustin
@Dustin, was würdest du in diesem Fall tun? –