diff --git a/cmd/mstdn/cmd_upload.go b/cmd/mstdn/cmd_upload.go
new file mode 100644
index 0000000..15f912e
--- /dev/null
+++ b/cmd/mstdn/cmd_upload.go
@@ -0,0 +1,33 @@
+package main
+
+import (
+	"context"
+	"errors"
+	"fmt"
+
+	"github.com/mattn/go-mastodon"
+	"github.com/urfave/cli"
+)
+
+func cmdUpload(c *cli.Context) error {
+	if !c.Args().Present() {
+		return errors.New("arguments required")
+	}
+	client := c.App.Metadata["client"].(*mastodon.Client)
+	for i := 0; i < c.NArg(); i++ {
+		attachment, err := client.UploadMedia(context.Background(), c.Args().Get(i))
+		if err != nil {
+			return err
+		}
+		if i > 0 {
+			fmt.Fprintln(c.App.Writer)
+		}
+		fmt.Fprintf(c.App.Writer, "ID        : %v\n", attachment.ID)
+		fmt.Fprintf(c.App.Writer, "Type      : %v\n", attachment.Type)
+		fmt.Fprintf(c.App.Writer, "URL       : %v\n", attachment.URL)
+		fmt.Fprintf(c.App.Writer, "RemoteURL : %v\n", attachment.RemoteURL)
+		fmt.Fprintf(c.App.Writer, "PreviewURL: %v\n", attachment.PreviewURL)
+		fmt.Fprintf(c.App.Writer, "TextURL   : %v\n", attachment.TextURL)
+	}
+	return nil
+}
diff --git a/cmd/mstdn/main.go b/cmd/mstdn/main.go
index a3a3d15..2bd18fd 100644
--- a/cmd/mstdn/main.go
+++ b/cmd/mstdn/main.go
@@ -213,6 +213,11 @@ func makeApp() *cli.App {
 			Usage:  "show followers",
 			Action: cmdFollowers,
 		},
+		{
+			Name:   "upload",
+			Usage:  "upload file",
+			Action: cmdUpload,
+		},
 	}
 	return app
 }