基本はサンプルやデモ見て。
ハマったポイント2つ。
1つは、inputタグのname属性にfileがないとうまくサーバーに遅れていなかったっぽいこと。
<input class="input-file" type="file" enctype="multipart/form-data" name="file">
2つ目は、サーバからの返り値を指定する第4引数にjsonを指定した時に、扱いがjQuery.ajax()のときと違って戸惑ったってこと。
ajax()の時にも、返り値値にjsonを指定できるが、その時は、サーバの返すべき適切なヘッダーは「application/json」だった。それに対して、upload()の方で適切なヘッダーは「text/html」。
で、upload()のcallback関数の第一引数に渡される値は、jsonのルートになっていて、そのまま使える。
function (res) {
alert(res.val);
}のように。