Sto costruendo un sistema di archiviazione BLOB e ho scelto Go come linguaggio di programmazione. Creo uno stream per eseguire un caricamento di file multipart dal client al server BLOB.Golang io.copy due volte sul corpo della richiesta
Lo stream funziona bene, ma voglio fare un hash sha1 dal corpo della richiesta. Ho bisogno di IO. Coprire il corpo due volte. Lo sha1 viene creato ma i multipart streams 0 byte dopo di ciò.
- Per creare l'hash
- per lo streaming il corpo come multipart
qualche idea di come posso fare questo?
l'upload cliente
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
}
.....
}
lo SHA1 gestire 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
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
}
Ho fatto in modo che funzionasse con @OneofOne ho postato il risultato finale più tardi quando ho ripulito il pasticcio che ho fatto –
Non hai davvero bisogno di tanto codice e sicuramente non hai bisogno di memorizzare un'intera copia contigua di il tuo blob nella RAM. Ho fatto una cosa simile con blob multi-GB su dispositivi affamati di RAM senza problemi. – Dustin
@Dustin cosa faresti in questo caso? –