File upload server
This example demonstrates how to build a simple file upload endpoint
with swagger and go-swagger.
Try it
- Build the server
 
cd restapi/cmd/file-upload-server
go build
./file-upload-server --port 8000
2021/01/17 18:54:09 Serving file upload at http://127.0.0.1:8000
- Run the client
 
From another terminal:
go run upload_file.go swagger.yml
Logs on the server:
2021/01/17 18:54:15 received file name: swagger.yml
2021/01/17 18:54:15 received file size: 512
2021/01/17 18:54:15 copied bytes 512
2021/01/17 18:54:15 file uploaded copied as upload427417421/uploaded_file_0.dat
The file has been copied in a temporary folder cmd/file-upload-server/upload*/
Specification
We use the swagger type file in a multipart form, like so:
paths:
  /upload:
    post:
      consumes:
      - multipart/form-data
      parameters:
      - name: file
        in: formData
        type: file
Server side
The handler receives a io.ReadCloser as the file to consume.
Under the hood, the runtime builds this with a *runtime.File, which provides access to some header information, such as:
		if namedFile, ok := params.File.(*runtime.File); ok {
			log.Printf("received file name: %s", namedFile.Header.Filename)
			log.Printf("received file size: %d", namedFile.Header.Size)
		}
Client side
The local file is handled as a runtime.NamedReadCloser (that is, a io.ReadCloser plus the Name() string method).
A regular os.File satisfies this.
The file can be passed directly to the client method, like so:
	params := uploads.NewUploadFileParams().WithFile(reader)
	_, err := uploader.Uploads.UploadFile(params)