frontend: move file (on the same partition) instead of open, write, close the final file
This commit is contained in:
parent
cab95b7985
commit
cb1fe0847b
2 changed files with 21 additions and 31 deletions
|
@ -17,6 +17,7 @@ const startedFile = "started"
|
||||||
|
|
||||||
var TeamsDir string
|
var TeamsDir string
|
||||||
var SubmissionDir string
|
var SubmissionDir string
|
||||||
|
var TmpSubmissionDir string
|
||||||
|
|
||||||
var touchTimer *time.Timer = nil
|
var touchTimer *time.Timer = nil
|
||||||
|
|
||||||
|
@ -70,10 +71,11 @@ func main() {
|
||||||
log.SetPrefix("[frontend] ")
|
log.SetPrefix("[frontend] ")
|
||||||
|
|
||||||
SubmissionDir = path.Clean(SubmissionDir)
|
SubmissionDir = path.Clean(SubmissionDir)
|
||||||
|
TmpSubmissionDir = path.Join(SubmissionDir, ".tmp")
|
||||||
|
|
||||||
log.Println("Creating submission directory...")
|
log.Println("Creating submission directory...")
|
||||||
if _, err := os.Stat(SubmissionDir); os.IsNotExist(err) {
|
if _, err := os.Stat(TmpSubmissionDir); os.IsNotExist(err) {
|
||||||
if err := os.MkdirAll(SubmissionDir, 0777); err != nil {
|
if err := os.MkdirAll(TmpSubmissionDir, 0777); err != nil {
|
||||||
log.Fatal("Unable to create submission directory: ", err)
|
log.Fatal("Unable to create submission directory: ", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -42,40 +43,27 @@ func saveFile(dirname string, filename string, r *http.Request) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var f *os.File
|
// Write content to temp file
|
||||||
|
tmpfile, err := ioutil.TempFile(TmpSubmissionDir, "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
writer := bufio.NewWriter(tmpfile)
|
||||||
|
reader := bufio.NewReader(r.Body)
|
||||||
|
if _, err := reader.WriteTo(writer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
writer.Flush()
|
||||||
|
tmpfile.Close()
|
||||||
|
|
||||||
if filename == "" {
|
if filename == "" {
|
||||||
if fd, err := ioutil.TempFile(dirname, ""); err != nil {
|
filename = path.Base(tmpfile.Name())
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
defer f.Close()
|
|
||||||
f = fd
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if fd, err := os.Create(path.Join(dirname, filename)); err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
defer f.Close()
|
|
||||||
f = fd
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read request body
|
if err := os.Rename(tmpfile.Name(), path.Join(dirname, filename)); err != nil {
|
||||||
var body []byte
|
log.Println("[ERROR] Unable to move file: ", err)
|
||||||
if r.ContentLength > 0 {
|
|
||||||
tmp := make([]byte, 1024)
|
|
||||||
for {
|
|
||||||
n, err := r.Body.Read(tmp)
|
|
||||||
for j := 0; j < n; j++ {
|
|
||||||
body = append(body, tmp[j])
|
|
||||||
}
|
|
||||||
if err != nil || n <= 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
f.Write(body)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue