This article mainly introduces the Vue implementation of the file dragging and uploading function with a progress bar. This article introduces it to you in great detail through example code and has reference value. Friends who need it can refer to it
1. Basic interface
<!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> <p id="app" class="m-5"> <p class="dropbox p-3"> <h2 class="text-center">把要上传的文件拖动到这里</h2> </p> </p> <script> new Vue({ el: '#app', data: {}, methods: {}, mounted: function () {} }); </script> </body> </html>
##2. Detect drag events
First let the page support file dragging, add code in Vue's mounted() function: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); }
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]); } } },
3. Handle drag events
Now, we need to add functionality to the uploadFile() function so that when a file is dragged, the file name and an upload progress bar appear in the drag area . First define the files attribute in Vue's data object to save the names of all files dragged to the browser. Then whenever the uploadFile() function is called, save the file name and upload progress to files:data: { files: [] }, methods: { uploadFile: function (file) { var item = { name: file.name, uploadPercentage: 67 }; this.files.push(item); }, }
<p class="dropbox p-3"> <h2 class="text-center">把要上传的文件拖动到这里</h2> <p class="border m-2 d-inline-block p-4" style="width:15rem" v-for="file in files"> <h5 class="mt-0">{{ file.name }}</h5> <p class="progress"> <p class="progress-bar progress-bar-striped" :style="{ width: file.uploadPercentage+'%' }"></p> </p> </p> </p>
Drag the uploaded file here</h2>
In this way, the drag effect will be:##4. File uploadNext to implement real file upload, continue to add code to the uploadFile() function:
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 is used here, and the file to be uploaded is attached to on the FormData and sent to the PHP side through AJAX. PHP side code:
if (isset($_FILES['myFile'])) { move_uploaded_file($_FILES['myFile']['tmp_name'], 'uploads/' . $_FILES['myFile']['name']); echo 'OK'; } else { echo 'No file specified'; }
Now refresh the page and drag the two files on your computer into the browser. The PHP side will receive and save the files to the uploads directory:
Tips: If PHP returns No file specified when dragging and dropping, or $_FILES is NULL, it is possible that PHP limits the maximum bytes of the POST request, or limits the size of the uploaded file. At this time, you need to adjust these two configurations in php.ini:
post_max_size = 20M // POST请求的最大字节数 upload_max_filesize = 20M // 上传文件的最大体积
Display of progress barThe basic upload function is completed , and finally we complete the progress bar. Whenever an AJAX request sends data for a period of time, a progress event will be generated. We can listen to the progress event to know the current upload 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 represents how many bytes are currently sent by AJAX, e .total represents the total number of bytes sent by AJAX. These two properties allow you to calculate the upload progress percentage.
In this way, a file drag and upload function with a progress bar is completed.
Attachment: The complete code
<!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> <p id="app" class="m-5"> <p class="dropbox p-3"> <h2 v-if="files.length===0" class="text-center">把要上传的文件拖动到这里</h2> <p class="border m-2 d-inline-block p-4" style="width:15rem" v-for="file in files"> <h5 class="mt-0">{{ file.name }}</h5> <p class="progress"> <p class="progress-bar progress-bar-striped" :style="{ width: file.uploadPercentage+'%' }"></p> </p> </p> </p> </p> <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>
The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.
Related articles:
How to implement the dialog box in VueHow to use the compile operation method in VueAbout the dialog box el-dialog closing event in element ui (detailed tutorial)The above is the detailed content of How to implement file drag and upload function with progress bar in Vue. For more information, please follow other related articles on the PHP Chinese website!