Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Загрузка файла — одно из самых распространенных бизнес-требований. Функция загрузки может быть простой или сложной. Простая вещь — загрузить файл. Сложная вещь включает в себя возобновление загрузки больших файлов, контроль параллелизма и т. д. Я не знаю сколько все знают о загрузке. Сегодня я хочу поделиться с вами некоторыми из наиболее распространенных сценариев загрузки требований. Без лишних слов, давайте начнем:
перетащить загрузить
Загрузка с помощью перетаскивания включает в себя взаимодействие со стилями и получение информации о файле Затем давайте сначала разберемся с несколькими событиями, связанными с перетаскиванием:
- dragover — срабатывает, когда перетаскиваемый объект входит в целевой контейнер
- dragleave — срабатывает, когда перетаскиваемый объект покидает целевой контейнер
- drop — перетаскиваемый объект попадает в целевой контейнер, срабатывает при отпускании кнопки мыши
После понимания этих событий довольно легко реализовать загрузку с помощью перетаскивания. Сначала о рендерах:
Показать результаты
Когда перетаскиваемый объект входит в целевой контейнер, граница контейнера становится красной. Когда целевой контейнер перетаскивается или отпускается кнопка мыши, граница контейнера становится серой. Получает информацию о файле перетаскиваемого объекта при отпускании кнопки мыши.
Код
<template>
<div ref="drag" class="drag">
<div class="drag-icon-box">
<!-- 采用的是 element-ui 的图标 -->
<i class="el-icon-upload"></i>
</div>
<div class="drag-message">
<span class="drag-message-title">将文件拖动到此处,或</span>
<label for="file" class="drag-message-label">
<input
class="drag-message-input"
type="file"
id="file"
name="file"
@change="handleFileChange"
/>
<span class="drag-message-manual">点击上传</span>
</label>
</div>
</div>
</template>
<script>
export default {
data() {
return {
file: null
}
},
async mounted() {
// 给容器绑定相关的拖拽事件
this.bindEvents()
},
methods: {
bindEvents() {
const drag = this.$refs.drag
// 被拖动的对象进入目标容器
drag.addEventListener('dragover', e => {
e.preventDefault()
drag.style.borderColor = 'red'
})
// 被拖动的对象离开目标容器
drag.addEventListener('dragleave', e => {
e.preventDefault()
drag.style.borderColor = '#eee'
})
// 被拖动的对象进入目标容器,释放鼠标键
drag.addEventListener('drop', e => {
e.preventDefault()
drag.style.borderColor = '#eee'
const fileList = e.dataTransfer.files
this.file = fileList[0]
this.uploadFile()
})
},
async uploadFile() {
const form = new FormData()
form.append('name', 'file')
form.append('file', this.file)
const res = await axios.post('/upload', form)
},
handleFileChange(e) {
const file = e.target.files[0]
if (!file) return
this.file = file
this.uploadFile()
}
}
}
</script>
<style lang="scss" scoped>
.drag {
width: 660px;
height: 300px;
border: 2px dashed;
border-color: #a3a3a3;
border-radius: 5px;
margin: 0 auto;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
flex-wrap: wrap;
.drag-icon-box {
width: 100%;
height: 60px;
text-align: center;
font-size: 50px;
line-height: 60px;
color: #606266;
}
.drag-message {
width: 100%;
height: 50px;
line-height: 50px;
text-align: center;
.drag-message-title {
font-size: 14px;
color: #606266;
}
.drag-message-label {
width: 120px;
height: 50px;
height: auto;
position: relative;
overflow: hidden;
.drag-message-input {
position: absolute;
left: -100px;
top: -100px;
z-index: -1;
display: none;
}
.drag-message-manual {
font-size: 14px;
color: #4b87ff;
cursor: pointer;
}
}
}
}
</style>
загрузить индикатор выполнения
Индикатор выполнения, возможно, является наиболее распространенным требованием, особенно при загрузке больших файлов. Метод реализации также относительно прост, с использованием аксиомonUploadProgressметод подойдет.
Показать результаты
Код
<div>
<!-- 采用的是 element-ui 的进度条组件 -->
<el-progress
:stroke-width="20"
:text-inside="true"
:percentage="uploadProgress"
></el-progress>
</div>
<script>
export default {
data() {
return {
file: null,
uploadProgress: 0
}
},
methods: {
async uploadFile() {
const form = new FormData()
form.append('name', 'file')
form.append('file', this.file)
const res = await axios.post('/uploadfile', form, {
onUploadProgress: progress => {
this.uploadProgress = Number(
((progress.loaded / progress.total) * 100).toFixed(2)
)
}
})
},
handleFileChange(e) {
const file = e.target.files[0]
if (!file) return
this.file = file
this.uploadFile()
}
}
}
</script>
отменить загрузку
Когда загрузка идет медленно и так хочется поймать или щелкнуть рукой, загруженное видео не должно быть загружено (вы знаете), в случае ожидания загрузки, возможность его отменить? Ответ конечно возможен.
Показать результаты
По сути, отмена загрузки — это отменаajaxзапрос, доступенaxiosиз
cancel tokenотменить.
Способ 1: ИспользованиеCancelToken.sourceСоздание фабричного методаcancel token
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.post('/upload', form, {
cancelToken: source.token
})
source.cancel();
Метод два: Функция передачи в ИсполнительCancelTokenконструктор для созданияcancel token
const CancelToken = axios.CancelToken;
let cancel;
axios.post('/upload', form, {
cancelToken: new CancelToken(function executor(c) {
cancel = c;
})
});
cancel();
Заинтересованные студенты могут попробовать и включить описанные выше методы в свои проекты.
Суммировать
хорошо, выше приведены некоторые из наиболее распространенных сценариев в требованиях к загрузке.Будь то загрузка с помощью перетаскивания или загрузка с вставкой, самое главное — получить информацию о файле через соответствующее событие. И индикатор выполнения и отмена загрузки используютсяaxiosизapiреализовать,axiosТак же есть много практичных вариантов комплектации, можете изучить сами.
Добро пожаловать, чтобы оставить сообщение в области комментариев, официальный представитель Nuggets будет вПроект «Звезда раскопок»После события 100 штук Наггетсов будут разыграны в области комментариев. Если статья была вам полезна, не забудьте поставить лайк~
Я слышал, что людям, которые любят ставить лайки, не везет, я верю, что в этом году ты сдашь все экзамены и выиграешь все призы😘