Submitting files with this form encoding is of course going to have the base64 overhead, but otherwise this looks great!
Instead of encoding the files directly inside JSON, you could add them as extra parts of the MIME message, and just have a reference in the JSON value (as in email, which uses a "cid:<part-identifier>" URI to inline images as such, as described in RFC2392).
You'd still need special support on the server, though.
HTTP connections typically use compression with any modern browser and server, so there is likely to be little overhead in practice.