Vue 진행 막대 가 있 는 파일 드래그 업로드 기능 구현

1.기본 인터페이스

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport"
   content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">
 <script src="https://cdn.bootcss.com/vue/2.5.13/vue.min.js"></script>
 <style>
  .dropbox {
   border: .25rem dashed #007bff;
   min-height: 5rem;
  }
 </style>
 <title>Document</title>
</head>
<body>
<div id="app" class="m-5">
 <div class="dropbox p-3">
  <h2 class="text-center">            </h2>
 </div>
</div>
<script>
 new Vue({
  el: '#app',
  data: {},
  methods: {},
  mounted: function () {}
 });
</script>
</body>
</html>

2.드래그 이벤트 감지
먼저 페이지 에 파일 드래그 를 지원 하고 Vue 의 mounted()함수 에 코드 를 추가 합 니 다.

mounted: function () {
 var dropbox = document.querySelector('.dropbox');
 dropbox.addEventListener('dragenter', this.onDrag, false);
 dropbox.addEventListener('dragover', this.onDrag, false);
 dropbox.addEventListener('drop', this.onDrop, false);
}
파일 을 브 라 우 저의 드래그 영역 으로 끌 면 세 가지 이벤트 가 발생 합 니 다.
  • 파일 이 드래그 구역 에 처음 들 어 갔 을 때 dragenter 사건 을 촉발 합 니 다
  • 파일 이 드래그 구역 에서 이리 저리 끌 때 dragover 이벤트 가 계속 발생 합 니 다
  • 파일 이 드래그 구역 에 있 고 마 우 스 를 놓 았 을 때 drop 이벤트 가 발생 합 니 다
  • 드래그 업 로드 를 실현 하려 면 drop 이벤트 에 만 관심 을 가 져 야 합 니 다.그러나 다른 두 사건 도 브 라 우 저의 기본 행동 을 막 기 위해 감청 이 필요 하 다.막 지 않 으 면 브 라 우 저 로 파일 을 끌 어 올 릴 때 브 라 우 저 는 자동 으로 이 파일(기본 행동)을 다운로드 합 니 다.drop 이벤트 가 실행 되 지 않 습 니 다.
    이벤트 의 감청 함 수 는 Vue 의 methods 대상 에 추 가 됩 니 다.
    
    methods: {
     uploadFile: function (file) {
      console.log(file);
     },
     onDrag: function (e) {
      e.stopPropagation();
      e.preventDefault();
     },
     onDrop: function (e) {
      e.stopPropagation();
      e.preventDefault();
      var dt = e.dataTransfer;
      for (var i = 0; i !== dt.files.length; i++) {
       this.uploadFile(dt.files[i]);
      }
     }
    },
    onDrop()함수 에 서 는 e.dataTransfer.files 를 통 해 사용자 가 브 라 우 저 로 드래그 하 는 파일 의 기본 정 보 를 얻 을 수 있 습 니 다.uploadFile()함 수 는 현재 이 정보 만 인쇄 되 어 있 습 니 다.브 라 우 저 로 드래그 하 는 모든 파일 이 File 대상 임 을 알 수 있 습 니 다.

    3.드래그 이벤트 처리
    현재,우 리 는 uploadFile()함수 에 기능 을 추가 하여 파일 을 드래그 할 때 드래그 구역 에 파일 이름과 업로드 진도 막대 가 나타 납 니 다.
    우선 Vue 의 data 대상 에 files 속성 을 정의 하여 브 라 우 저 에 끌 어 다 놓 은 모든 파일 의 이름 을 저장 합 니 다.그리고 upload File()함수 가 호출 될 때마다 파일 이름과 업로드 진 도 를 files 에 저장 합 니 다.
    
    data: {
     files: []
    },
    methods: {
     uploadFile: function (file) {
      var item = {
       name: file.name,
       uploadPercentage: 67
      };
      this.files.push(item);
     },
    }
    업로드 진도 기능 은 뒤에서 소개 하고 고정 값 을 쓰 세 요.
    이에 따라 HTML 코드 에 서 는 v-for 키워드 로 files 의 모든 항목 을 표시 합 니 다.
    
    <div class="dropbox p-3">
     <h2 class="text-center">            </h2>
     <div class="border m-2 d-inline-block p-4" style="width:15rem" v-for="file in files">
      <h5 class="mt-0">{{ file.name }}</h5>
      <div class="progress">
       <div class="progress-bar progress-bar-striped"
         :style="{ width: file.uploadPercentage+'%' }"></div>
      </div>
     </div>
    </div>
    그리고'업로드 할 파일 을 여기에 끌 어 다 놓 으 세 요'라 는 힌트 는 드래그 영역 에 파일 이 없 을 때 만 표 시 됩 니 다.
    업로드 할 파일 을 여기에 끌 어 옵 니 다
    이렇게 하면 드래그 효과 가 있 습 니 다.

    4.파일 업로드
    다음은 진정한 파일 업 로드 를 실현 하고 uploadFile()함수 에 코드 를 계속 추가 합 니 다.
    
    uploadFile: function (file) {
     var item = {
      name: file.name,
      uploadPercentage: 67
     };
     this.files.push(item);
     var fd = new FormData();
     fd.append('myFile', file);
    
     var xhr = new XMLHttpRequest();
     xhr.open('POST', 'upload.php', true);
     xhr.send(fd);
    },
    여기에 FormData 를 사용 하여 업로드 할 파일 을 FormData 에 첨부 하고 AJAX 방식 으로 PHP 단 에 보 냅 니 다.PHP 엔 드 코드:
    
    if (isset($_FILES['myFile'])) {
     move_uploaded_file($_FILES['myFile']['tmp_name'], 'uploads/' . $_FILES['myFile']['name']);
     echo 'OK';
    } else {
     echo 'No file specified';
    }
    현재 다음 페이지 를 새로 고치 고 컴퓨터 에 있 는 두 개의 파일 을 브 라 우 저 에 끌 어 다 놓 으 면 PHP 쪽 에서 uploads 디 렉 터 리 에 파일 을 받 고 저장 합 니 다.

    알림:끌 어 다 놓 을 때 PHP 를 만나면 No file specified 또는$FILES 가 NULL 인 경우 PHP 가 POST 요청 의 최대 바이트 나 업로드 파일 의 부 피 를 제한 한 것 일 수 있 습 니 다.이 때 php.ini 의 두 설정 을 조정 해 야 합 니 다.
    
    post_max_size = 20M // POST        
    upload_max_filesize = 20M //          
    진도 바 전시
    기본 적 인 업로드 기능 이 완성 되 었 습 니 다.마지막 으로 진도 표를 완성 하 겠 습 니 다.AJAX 가 데 이 터 를 보 내 달라 고 요청 할 때마다 progress 이벤트 가 생 성 됩 니 다.progress 이 벤트 를 감청 하여 현재 업로드 진 도 를 알 수 있 습 니 다.
    
    uploadFile: function (file) {
      ...
      xhr.upload.addEventListener('progress', function (e) {
        item.uploadPercentage = Math.round((e.loaded * 100) / e.total);
      }, false);
      xhr.send(fd);
    },
    e.loaded 는 현재 AJAX 가 얼마나 많은 바이트 를 보 냈 는 지,e.totalk 은 AJAX 가 모두 얼마나 많은 바이트 를 보 내야 하 는 지 를 나타 낸다.이 두 속성 을 통 해 업로드 진도 의 백분율 을 계산 할 수 있 습 니 다.
    이렇게 하면 진도 가 있 는 파일 드래그 업로드 기능 이 완 료 됩 니 다.
    첨부:전체 코드
    
    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport"
         content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
      <script src="https://cdn.bootcss.com/vue/2.5.13/vue.min.js"></script>
      <style>
        .dropbox {
          border: .25rem dashed #007bff;
          min-height: 5rem;
        }
      </style>
      <title>Document</title>
    </head>
    <body>
    <div id="app" class="m-5">
      <div class="dropbox p-3">
        <h2 v-if="files.length===0" class="text-center">            </h2>
        <div class="border m-2 d-inline-block p-4" style="width:15rem" v-for="file in files">
          <h5 class="mt-0">{{ file.name }}</h5>
          <div class="progress">
            <div class="progress-bar progress-bar-striped"
               :style="{ width: file.uploadPercentage+'%' }"></div>
          </div>
        </div>
      </div>
    </div>
    <script>
      new Vue({
        el: '#app',
        data: {
          files: []
        },
        methods: {
          uploadFile: function (file) {
            var item = {
              name: file.name,
              uploadPercentage: 0
            };
            this.files.push(item);
            var fd = new FormData();
            fd.append('myFile', file);
            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'upload.php', true);
            xhr.upload.addEventListener('progress', function (e) {
              item.uploadPercentage = Math.round((e.loaded * 100) / e.total);
            }, false);
            xhr.send(fd);
          },
          onDrag: function (e) {
            e.stopPropagation();
            e.preventDefault();
          },
          onDrop: function (e) {
            e.stopPropagation();
            e.preventDefault();
            var dt = e.dataTransfer;
            for (var i = 0; i !== dt.files.length; i++) {
              this.uploadFile(dt.files[i]);
            }
          }
        },
        mounted: function () {
          var dropbox = document.querySelector('.dropbox');
          dropbox.addEventListener('dragenter', this.onDrag, false);
          dropbox.addEventListener('dragover', this.onDrag, false);
          dropbox.addEventListener('drop', this.onDrop, false);
        }
      });
    </script>
    </body>
    </html>
    총결산
    위 에서 말씀 드 린 바 와 같이 편집장 님 께 서 소개 해 주신 Vue 는 진도 표 가 있 는 파일 드래그 업로드 기능 을 실현 합 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기