form タグのない HTML の input 要素をつかってファイルをアップロードする方法

なんかめっちゃひさしぶりに記事書きます。 Day One でためてきゃいいわーってなってて、 アウトプットはプライベートになってました。

file upload - Sending multipart/formdata with jQuery.ajax - Stack Overflow

sample code

function hoge(formData){
  var dfd = $.Deferred();
  return $.ajax({
    url: '/api/check_icon',
    type: 'POST',
    scriptCharset: 'utf-8',
    data: formData,
    processData: false,
    contentType: false,
    dataType: 'json',
    cache : false,
    async: false
  }).then(function(res) {
    if(res.status == 'SUCCESS') {
      dfd.resolve();
    } else {
      dfd.reject();
    }
    return dfd.promise();
  }, function(e, s) {
    dfd.reject();
    return dfd.promise();
  });
}
var data = new FormData();
data.append('homeImg', $('#inputFile')[0].files[0]);
hoge(data).done(function(data){
  console.log(data);
  //after();
});

html

<input type="file" id="inputFile">

このコードでは、ID が inputFile の input['file'] で設定されているファイルを homeImg というパラメータ名でサーバに非同期処理でアップロードするサンプルです。

enctype での multipartform-data 設定はなくてもいけます。 new FormData したオブジェクトに、append で名前と input['file'] 要素をいれてるのがミソです。 ほかの文字列パラメータや複数画像ももちろん設定できます。 アップロードサイズには気をつけてください。