comparison pkg/controllers/agmimports.go @ 2194:4d6979dedb11

Imports: Deduplicted file upload code.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 12 Feb 2019 11:09:55 +0100
parents 515bdc765565
children 33af355047e1
comparison
equal deleted inserted replaced
2193:35c56ace42b9 2194:4d6979dedb11
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> 12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
13 13
14 package controllers 14 package controllers
15 15
16 import ( 16 import (
17 "bufio"
18 "io"
19 "io/ioutil"
20 "log" 17 "log"
21 "net/http" 18 "net/http"
22 "os"
23 "path/filepath"
24 "time" 19 "time"
25 20
26 "gemma.intevation.de/gemma/pkg/auth" 21 "gemma.intevation.de/gemma/pkg/auth"
27 "gemma.intevation.de/gemma/pkg/common" 22 "gemma.intevation.de/gemma/pkg/common"
28 "gemma.intevation.de/gemma/pkg/config"
29 "gemma.intevation.de/gemma/pkg/imports" 23 "gemma.intevation.de/gemma/pkg/imports"
24 "gemma.intevation.de/gemma/pkg/misc"
30 ) 25 )
31 26
32 const ( 27 const (
28 approvedGaugeMeasurementsName = "approvedgm"
33 maxApprovedGaugeMeasurementSize = 25 * 1024 * 1024 29 maxApprovedGaugeMeasurementSize = 25 * 1024 * 1024
34 approvedGaugeMeasurementsName = "approvedgm"
35 ) 30 )
36
37 func storeApprovedGaugeMeasurements(req *http.Request) (string, error) {
38
39 // Check for direct upload.
40 f, _, err := req.FormFile(approvedGaugeMeasurementsName)
41 if err != nil {
42 return "", err
43 }
44 defer f.Close()
45
46 dir, err := ioutil.TempDir(config.TmpDir(), approvedGaugeMeasurementsName)
47 if err != nil {
48 return "", err
49 }
50
51 o, err := os.Create(filepath.Join(dir, "agm.csv"))
52 if err != nil {
53 os.RemoveAll(dir)
54 return "", err
55 }
56
57 out := bufio.NewWriter(o)
58
59 if _, err = io.Copy(out, io.LimitReader(f, maxApprovedGaugeMeasurementSize)); err != nil {
60 o.Close()
61 os.RemoveAll(dir)
62 return "", err
63 }
64
65 if err = out.Flush(); err != nil {
66 o.Close()
67 os.RemoveAll(dir)
68 return "", err
69 }
70
71 return dir, nil
72 }
73 31
74 func importApprovedGaugeMeasurements(rw http.ResponseWriter, req *http.Request) { 32 func importApprovedGaugeMeasurements(rw http.ResponseWriter, req *http.Request) {
75 33
76 dir, err := storeApprovedGaugeMeasurements(req) 34 dir, err := misc.StoreUploadedFile(
35 req,
36 approvedGaugeMeasurementsName,
37 "agm.csv",
38 maxApprovedGaugeMeasurementSize)
77 if err != nil { 39 if err != nil {
78 log.Printf("error: %v\n", err) 40 log.Printf("error: %v\n", err)
79 http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError) 41 http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
80 return 42 return
81 } 43 }