@@ -406,7 +406,7 @@ type fileRequest struct {
406406func paramsForFileUpload () * UntypedRequestBinder {
407407 nameParam := spec .FormDataParam ("name" ).Typed ("string" , "" )
408408
409- fileParam := spec .FileParam ("file" )
409+ fileParam := spec .FileParam ("file" ). AsRequired ()
410410
411411 params := map [string ]spec.Parameter {"Name" : * nameParam , "File" : * fileParam }
412412 return NewUntypedRequestBinder (params , new (spec.Swagger ), strfmt .Default )
@@ -469,4 +469,63 @@ func TestBindingFileUpload(t *testing.T) {
469469
470470 data = fileRequest {}
471471 assert .Error (t , binder .Bind (req , nil , runtime .JSONConsumer (), & data ))
472+
473+ writer = multipart .NewWriter (body )
474+ _ = writer .WriteField ("name" , "the-name" )
475+ assert .NoError (t , writer .Close ())
476+
477+ req , _ = http .NewRequest ("POST" , urlStr , body )
478+ req .Header .Set ("Content-Type" , writer .FormDataContentType ())
479+
480+ data = fileRequest {}
481+ assert .Error (t , binder .Bind (req , nil , runtime .JSONConsumer (), & data ))
482+ }
483+
484+ func paramsForOptionalFileUpload () * UntypedRequestBinder {
485+ nameParam := spec .FormDataParam ("name" ).Typed ("string" , "" )
486+ fileParam := spec .FileParam ("file" ).AsOptional ()
487+
488+ params := map [string ]spec.Parameter {"Name" : * nameParam , "File" : * fileParam }
489+ return NewUntypedRequestBinder (params , new (spec.Swagger ), strfmt .Default )
490+ }
491+
492+ func TestBindingOptionalFileUpload (t * testing.T ) {
493+ binder := paramsForOptionalFileUpload ()
494+
495+ body := bytes .NewBuffer (nil )
496+ writer := multipart .NewWriter (body )
497+ _ = writer .WriteField ("name" , "the-name" )
498+ assert .NoError (t , writer .Close ())
499+
500+ urlStr := "http://localhost:8002/hello"
501+ req , _ := http .NewRequest ("POST" , urlStr , body )
502+ req .Header .Set ("Content-Type" , writer .FormDataContentType ())
503+
504+ data := fileRequest {}
505+ assert .NoError (t , binder .Bind (req , nil , runtime .JSONConsumer (), & data ))
506+ assert .Equal (t , "the-name" , data .Name )
507+ assert .Nil (t , data .File .Data )
508+ assert .Nil (t , data .File .Header )
509+
510+ writer = multipart .NewWriter (body )
511+ part , err := writer .CreateFormFile ("file" , "plain-jane.txt" )
512+ assert .NoError (t , err )
513+ _ , _ = part .Write ([]byte ("the file contents" ))
514+ _ = writer .WriteField ("name" , "the-name" )
515+ assert .NoError (t , writer .Close ())
516+
517+ req , _ = http .NewRequest ("POST" , urlStr , body )
518+ req .Header .Set ("Content-Type" , writer .FormDataContentType ())
519+ assert .NoError (t , writer .Close ())
520+
521+ data = fileRequest {}
522+ assert .NoError (t , binder .Bind (req , nil , runtime .JSONConsumer (), & data ))
523+ assert .Equal (t , "the-name" , data .Name )
524+ assert .NotNil (t , data .File )
525+ assert .NotNil (t , data .File .Header )
526+ assert .Equal (t , "plain-jane.txt" , data .File .Header .Filename )
527+
528+ bb , err := ioutil .ReadAll (data .File .Data )
529+ assert .NoError (t , err )
530+ assert .Equal (t , []byte ("the file contents" ), bb )
472531}
0 commit comments