From 32e6b9b9094e2a4fbd82c9eb61d181afe532c3e2 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 10 Jan 2018 10:55:07 +0300 Subject: [PATCH] Write to .part file while writing --- src/uploader/main.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/uploader/main.go b/src/uploader/main.go index 74be1fe..ed39c3d 100644 --- a/src/uploader/main.go +++ b/src/uploader/main.go @@ -57,29 +57,35 @@ func upload(w http.ResponseWriter, r *http.Request) { log.Println(r.RemoteAddr, "non file form field") return } + h, err := blake2s.New256(nil) + if err != nil { + panic(err) + } fn := time.Now().Format(time.RFC3339Nano) - fd, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE, 0600) + fd, err := os.OpenFile(fn+".part", os.O_WRONLY|os.O_CREATE, 0600) if err != nil { log.Println(r.RemoteAddr, fn, p.FileName(), err) return } - defer fd.Close() - h, err := blake2s.New256(nil) - if err != nil { - panic(err) - } fdBuf := bufio.NewWriterSize(fd, WriteBufSize) mw := io.MultiWriter(fdBuf, h) n, err := io.Copy(mw, p) if err != nil { log.Println(r.RemoteAddr, fn, p.FileName(), err) + fd.Close() return } if err = fdBuf.Flush(); err != nil { log.Println(r.RemoteAddr, fn, p.FileName(), err) + fd.Close() return } + fd.Close() sum := hex.EncodeToString(h.Sum(nil)) + if err = os.Rename(fn+".part", fn); err != nil { + log.Println(r.RemoteAddr, fn, p.FileName(), n, sum, err) + return + } fmt.Fprintf(w, "bytes: %d\nBLAKE2s: %s\n", n, sum) log.Println(r.RemoteAddr, fn, p.FileName(), n, sum) } -- 2.44.0