Desidero consentire il caricamento dei file. Go viene utilizzato lato server per gestire le richieste. Vorrei inviare una risposta "File troppo grande" ogni volta che il file che stanno cercando di caricare è troppo grande. Vorrei farlo, prima dello l'intero file viene caricato (larghezza di banda).Caricamento file Golang: connessione chiusa se il file è troppo grande
Sto utilizzando il seguente snippet, ma è solo l'invio di una risposta dopo il caricamento del client. Salva un file da 5 kB.
const MaxFileSize = 5 * 1024
// This feels like a bad hack...
if r.ContentLength > MaxFileSize {
if flusher, ok := w.(http.Flusher); ok {
response := []byte("Request too large")
w.Header().Set("Connection", "close")
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(response)))
w.WriteHeader(http.StatusExpectationFailed)
w.Write(response)
flusher.Flush()
}
conn, _, _ := w.(http.Hijacker).Hijack()
conn.Close()
return
}
r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize)
err := r.ParseMultipartForm(1024)
if err != nil {
w.Write([]byte("File too large"));
return
}
file, header, err := r.FormFile("file")
if err != nil {
panic(err)
}
dst, err := os.Create("upload/" + header.Filename)
defer dst.Close()
if err != nil {
panic(err)
}
written, err := io.Copy(dst, io.LimitReader(file, MaxFileSize))
if err != nil {
panic(err)
}
if written == MaxFileSize {
w.Write([]byte("File too large"))
return
}
w.Write([]byte("Success..."))
Ingannevole. Forse potresti usare io.CopyN per leggere 'MaxFileSize + 1' byte. Se "err! = EOF', il limite è stato superato o c'era qualche altro problema. Non sono sicuro di quale comportamento l'utente vedrà nel browser se lo fai, però - provalo e guarda. Inoltre, capisco che questo è un codice di test, ma passare da 'panic's a error return è una buona idea per il tuo codice di produzione. – twotwotwo
Grazie per il suggerimento. Sostituire 'Copia' con' CopiaN' e leggere 'MaxFileSize + 1' byte non ha aiutato (alla fine del browser). Per quanto riguarda il panico, di solito ho uno speciale 'RecoverHandler', che recupera dal panico e si traduce in una bella pagina di errore 400. Grazie per aver notato però. –