diff --git a/commands/cli/parse.go b/commands/cli/parse.go
index 1f00c31618883976d65fa60095db91ede5d9f5e0..c6cb81ae411a47554444e5ea6e7185ce0f29661f 100644
--- a/commands/cli/parse.go
+++ b/commands/cli/parse.go
@@ -248,6 +248,13 @@ func parseArgs(inputs []string, stdin *os.File, argDefs []cmds.Argument, recursi
 		argDefIndex++
 	}
 
+	// check to make sure we didn't miss any required arguments
+	for _, argDef := range argDefs[argDefIndex:] {
+		if argDef.Required {
+			return nil, nil, fmt.Errorf("Argument '%s' is required", argDef.Name)
+		}
+	}
+
 	return stringArgs, fileArgs, nil
 }
 
diff --git a/commands/http/parse.go b/commands/http/parse.go
index d2d8725b675b9fb0d9bdaa7dde700044094e8dec..b8aa9c7e5eabd1baa74b8ef5a93cb4a4c064632f 100644
--- a/commands/http/parse.go
+++ b/commands/http/parse.go
@@ -2,6 +2,7 @@ package http
 
 import (
 	"errors"
+	"fmt"
 	"mime"
 	"net/http"
 	"strings"
@@ -54,6 +55,7 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 	args := make([]string, valCount)
 
 	valIndex := 0
+	requiredFile := ""
 	for _, argDef := range cmd.Arguments {
 		// skip optional argument definitions if there aren't sufficient remaining values
 		if valCount-valIndex <= numRequired && !argDef.Required {
@@ -78,6 +80,8 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 			} else {
 				break
 			}
+		} else if argDef.Type == cmds.ArgFile && argDef.Required && len(requiredFile) == 0 {
+			requiredFile = argDef.Name
 		}
 	}
 
@@ -101,6 +105,11 @@ func Parse(r *http.Request, root *cmds.Command) (cmds.Request, error) {
 		}
 	}
 
+	// if there is a required filearg, error if no files were provided
+	if len(requiredFile) > 0 && f == nil {
+		return nil, fmt.Errorf("File argument '%s' is required", requiredFile)
+	}
+
 	req, err := cmds.NewRequest(path, opts, args, f, cmd, optDefs)
 	if err != nil {
 		return nil, err