文件上传

 

Ajax上传文件(原生JS篇)

      <div class='progress'>

        <div class="step"></div>

    </div>

    <form action="">

        <input type="text" name='name' placeholder="请输入姓名">

        <input type="text" name='skill' placeholder="请输入技能">

        <input type="file" name='icon'>

    </form>

<input type="button" value='ajax2.0'>

 

      <style>

        .progress {

            width: 300px;

            height: 20px;

            border: 1px solid hotpink;

            border-radius: 20px;

            overflow: hidden;

        }

        .step {

            height: 100%;

            width: 0;

            background: greenyellow;

        }

    </style>

javascript部分

<script>

    //  如果我们要使用 ajax2.0 结合FormData 来提交数据 必须使用 post

    document.querySelector('input[type=button]').onclick = function () {

        //1.创建对象

        var xhr = new XMLHttpRequest();

        //2.设置请求行(get请求数据写在url后面)

        xhr.open('post', './saveFiles.php');

        //3.设置请求头(get请求可以省略,post不发送数据也可以省略)

        // 如果使用的时 formData可以不写 请求头 写了 无法正常上传文件

        //  xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

        //3.5注册回调函数

        xhr.onload = function () {

            console.log(xhr.responseText);

        }

        // XHR2.0新增 上传进度监控

        xhr.upload.onprogress = function (event) {

            //  console.log(event);

            var percent = event.loaded / event.total * 100 + '%';

            console.log(percent);

            // 设置 进度条内部step的 宽度

            document.querySelector('.step').style.width = percent;

        }

        // XHR2.0新增

        var data = new FormData(document.querySelector('form'));

        //4.请求主体发送(get请求为空,或者写null,post请求数据写在这里,如果没有数据,直接为空或者写null)

        xhr.send(data);

    }

</script>

PHP部分

<?php    

// 获取提交的文件信息

    print_r($_FILES);

 

 

    // 保存上传的数据

    move_uploaded_file($_FILES['icon']['tmp_name'],'./files/'.$_FILES['icon']['name']);

?>

二、上传 ( 基于vue )

1、页面使用 

 

<input type="file" ref="upload" @change='handleUploadChange($event)' style="display:none;">

  handleUploadFile(row){ //  通过某一事件触发 

    this.$refs['upload'].click();

  },

 

 

   async handleUploadChange(e){ // 

      try{

        let res = await this.CommonUpload(e);

        if(res.code == '200'){ // 获取其他code值,根据后台来定

            this.handleProjectAddFile(res.data)

        }else{}

      }

    catch(err){}

  }

 

 

2、方法封装 ( 只判断大小,也可通过accept判断要接收的类型 等其他类型 )

 

CommonUpload(e){

        const files = e.target.files;

        let formData = new FormData();

        if(files && files[0]) {

            const file = files[0];

            if(file.size > 1024 * 1024 *3) {

                alert('文件大小不能超过3M');

                return;

            } else {

                formData.append("multipartFile", file);

            }

        }

        this.uploadFile_(formData) // 为调用上传接口方法

    }

 

 

3、问题 当再次选择同一文件时,失效

解决: ( 上传后执行下面 )
this.$refs['upload'].value = ''; // 解决 input file 第二次失效的问题

原因:
input file value值为新选中的值,所以下次再选同一文件,不会触发change事件

上一篇:js文件上传(分块、断点续传)


下一篇:ajax发送请求