Mercurial > gemma
view pkg/controllers/srimports.go @ 1221:c193649d4f11
Add an area for temp uploads on the server to be addressed
by tokens. If unused they will me thrown away after 45 minutes.
There could be max 100 of them. If there are more to upload
the oldest are removed first.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 19 Nov 2018 16:15:30 +0100 |
parents | 49eead4fad3a |
children | bc4b642c8d04 |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> package controllers import ( "bufio" "encoding/hex" "io" "io/ioutil" "log" "net/http" "os" "path/filepath" "time" "gemma.intevation.de/gemma/pkg/auth" "gemma.intevation.de/gemma/pkg/config" "gemma.intevation.de/gemma/pkg/imports" "gemma.intevation.de/gemma/pkg/misc" ) const ( maxSoundingResultSize = 25 * 1024 * 1024 soundingResultName = "soundingresult" ) func downloadSoundingResult(req *http.Request) (string, error) { // Check first if we have a token. if token := req.FormValue("token"); token != "" { if _, err := hex.DecodeString(token); err != nil { return "", err } dir := config.TmpDir() if dir == "" { dir = os.TempDir() } // XXX: This should hopefully be race-free enough. now := time.Now().Format("2006-15-04-05") dst := filepath.Join(dir, soundingResultName+"-"+token+"-"+now) if err := misc.UnmakeTempFile(token, dst); err != nil { return "", err } } // Check for direct upload. f, _, err := req.FormFile(soundingResultName) if err != nil { return "", err } defer f.Close() dir, err := ioutil.TempDir(config.TmpDir(), soundingResultName) if err != nil { return "", err } o, err := os.Create(filepath.Join(dir, "sr.zip")) if err != nil { os.RemoveAll(dir) return "", err } out := bufio.NewWriter(o) if _, err = io.Copy(out, io.LimitReader(f, maxSoundingResultSize)); err != nil { o.Close() os.RemoveAll(dir) return "", err } if err = out.Flush(); err != nil { o.Close() os.RemoveAll(dir) return "", err } return dir, nil } func importSoundingResult(rw http.ResponseWriter, req *http.Request) { dir, err := downloadSoundingResult(req) if err != nil { log.Printf("error: %v\n", err) http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError) return } session, _ := auth.GetSession(req) jobID, err := imports.AddJob(imports.SRJobKind, session.User, dir) if err != nil { log.Printf("error: %v\n", err) http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError) return } log.Printf("info: added import #%d to queue\n", jobID) result := struct { ID int64 `json:"id"` }{ ID: jobID, } SendJSON(rw, http.StatusCreated, &result) }