I'm playing around with Mux and net/http
. Lately, I'm trying to get a simple server with one endpoint to accept a file upload.
Here's the code I've got so far:
server.go
package main
import (
"fmt"
"github.com/gorilla/mux"
"log"
"net/http"
)
func main() {
router := mux.NewRouter()
router.
Path("/upload").
Methods("POST").
HandlerFunc(UploadCsv)
fmt.Println("Starting")
log.Fatal(http.ListenAndServe(":8080", router))
}
endpoint.go
package main
import (
"fmt"
"net/http"
)
func UploadFile(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(5 * 1024 * 1024)
if err != nil {
panic(err)
}
fmt.Println(r.FormValue("fileupload"))
}
I think I've narrowed the issue down to actually retrieving the body from the request inside UploadFile
. When I run this cURL command:
curl http://localhost:8080/upload -F "fileupload=@test.txt" -vvv
I get an empty response (as expected; I'm not printing to the ResponseWriter
), but I just get a new (empty) line printed at the prompt where I'm running the server, instead of the request body.
I'm sending the file as multipart (AFAIK, implied by using -F
rather than -d
in cURL), and cURL's verbose output is showing 502 bytes sent:
$ curl http://localhost:8080/upload -F "fileupload=@test.txt" -vvv
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> POST /upload HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.51.0
> Accept: */*
> Content-Length: 520
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------b578878d86779dc5
>
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Fri, 18 Nov 2016 19:01:50 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
<
* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact
What's the proper way to receive files uploaded as multipart form data using a net/http
server in Go?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…