nodejs利用ajax实现网页无刷新上传图片

nodejs利用ajax实现网页无刷新上传图片

标签(空格分隔): nodejshtml


一般状况下上传图片是要经过提交form表单来实现的,可是这又不可避免的产生了网页转。
利用ajax技术和FormData()对象能够有效的解决这个问题node

废话很少说 直接上关键代码:git

html部分github

<div class="form-group">
   <label>File input</label>
   <input type="file" name="file" id="file">
    <p id="result"></p>
   <img id="img" src="">
</div>
<button id="upload" class="btn btn-default">提交</button>

这里注意input标签的 type="file"ajax


js部分:express

function uploadFile(){
  var file = document.getElementById("file")
  var formData = new FormData();
  formData.append('file',file.files[0]);
  $.ajax({
    url: '/upload',
    type: 'POST',
    data: formData,
    // async: false,
    cache: false,
    contentType: false,
    processData: false,
    success: function(data){
      if(200 === data.code) {
        $('#result').html("上传成功!");
        $('#img').attr('src',data.data);
      } else {
        $('#result').html("上传失败!");
      }
      console.log('imgUploader upload success');
    },
    error: function(){
      $("#result").html("与服务器通讯发生错误");
    }
  });
}

function postPage() {
        var uploada = document.getElementById('upload');
        uploada.addEventListener("click",function () {
            uploadFile();
        },false);
}

window.onload = function () {
    postPage();
}

nodejs部分:json

var storage = multer.diskStorage({
    destination: function (req, file, cb){
        cb(null, './public/images')
    },
    filename: function (req, file, cb){
        cb(null, file.originalname)
    }
});
var upload = multer({
    storage: storage
});
router.post('/upload', upload.single('file'), function (req, res, next) {
    var url = 'http://' + req.headers.host + '/images/' + req.file.originalname
    res.json({
        code : 200,
        data : url
    })
});

multer是express官方推荐的文件上传中间件。api

  • 文件上传有如下方法
    upload.single(‘file’), //适用于单文件上传。
    upload.array(‘file’,num), //适用于多文件上传,num为最多上传个数,上传文件的数量能够小于num。
    同时还提供了混合上传,好比A类文件1个,B类文件2个。官方API有详细说明。服务器

  • file为上传字段名称,当使用form表单submit方式上传时,必须与表单上传的name属性保持一致。app

  • 对上传文件大小限制,名称限制等都可在limits中加上,具体可加属性,请参考官方api。

multer官方文档