js 实现文件上传

一、利用 FormData 对象形式上传

       FormData 是 XMLHttpRequest 2 的产物,兼容 IE10+。

       FormData 对象,可以把form中所有表单元素的name与value组成一个queryString,提交到后台。在使用Ajax提交时,使用FormData对象可以减少拼接queryString的工作量。

       使用 FormData 对象

       1.取得form对象,作为参数传入到FormData对象

//html
//js var form = document.getElementById('form1'); var formdata = new FormData(form);

       2.创建一个FormData空对象,然后使用append方法添加key/value

var formdata = new FormData();  
formdata.append('name','fdipzone');  
formdata.append('gender','male');  

       使用FormData提交表单及上传文件实例:

       实例1

    一般项目中使用的点击上传文件的按钮跟 默认样式是不一样的,我们得自定义。方法是,自己写一个  

JS:

methods: {  
    triggerSelect () {  
      this.$refs.input.click()  
    },  
  
    selectedFile (e) {  
      console.log(e.target.files[0])  
      //根据项目需求做具体处理,比如说获取文件名  
    },  
  
    async upload () {  
      //如果不需要用到上传后的返回值可以把 async...await 语法去掉  
      let files = this.$refs.input.files;  
      if(files.length > 0) {  
        let form = new FormData();  
        form.append('file', files[0])  
        let data = await new Promise((resolve, reject) => {  
            axios({  
              url: '',  
              method: 'post',  
              data: form  
            })  
              .then(res => {  
                resolve(res)  
              })  
              .catch(err => {  
                reject(err)  
              })  
          })  
      }  
    }  
}  

       实例2

  
  
   
    
   FormData Demo 
   
   
    

name:

gender:male female

photo:

         server.php

  

      带显示图片的上传图片

    // -------- 将以base64的图片url数据转换为Blob --------
    function convertBase64UrlToBlob(urlData, filetype){
        //去掉url的头,并转换为byte
        var bytes = window.atob(urlData.split(',')[1]);
        
        //处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        var ia = new Uint8Array(ab);
        var i;
        for (i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }

        return new Blob([ab], {type : filetype});
    }
    
    $input.on('change', function (e) {
        var input = $input.get(0);
        var files = input.files || [];
        if (files.length === 0) {
            return;
        }

        console.log('选中 ' + files.length + ' 个文件');

        // 遍历选中的文件,预览、上传
        $.each(files, function (key, file) {
            var filename = file.name || '';
            var fileType = file.type || '';
            
            var reader = new FileReader();
            // onload事件
            reader.onload = function (e) {
                var base64 = e.target.result || this.result;
                var formData = new FormData();
                
                formData.append("upload_file", convertBase64UrlToBlob(base64, fileType), filename);
                var xhr = new XMLHttpRequest();
                // 开始上传
                xhr.open('POST', uploadImgUrl, true);
                
                // 发送数据
                xhr.send(formData);
            });
            
            reader.readAsDataURL(file);
        });
	});

二、base64 字符串方式上传图片

       base64 在线转换网站:http://tool.css-js.com/base64.html

       DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少 HTTP 请求,加快小图像的加载时间。 经过Base64 编码后的文件体积一般比源文件大 30% 左右。

// Base64 在CSS中的使用
.box{
  background-image: url("data:image/jpg;base64,/9j/4QMZR...");
}
// Base64 在HTML中的使用

(不推荐用base64,效率慢,消耗流量,占用空间。推荐使用把base64图片格式转换成FormData形式传递)

 

 

 

 

你可能感兴趣的:(JavaScript)