프로젝트 개발 중에 파일을 업로드해야 하는 경우가 자주 발생합니다. 이 글에서는 파일 업로드를 위해 elementplus에서 el-upload를 사용하는 방법을 자세히 소개하겠습니다.
먼저 엘업로드에서 어떤 속성과 이벤트를 구성할 수 있는지 살펴보겠습니다. T 속성
false
이거나 입니다. > 약속
을 거부하고 업로드가 중단됩니다. false
或者返回 Promise
且被 reject,则停止上传。
before-remove: 删除文件之前的钩子,参数为上传的文件和文件列表, 若返回 false
或者返回 Promise
且被 reject,则停止删除。
file-list/v-model:file-list: 默认上传文件
list-type: 文件列表的类型,'text' | 'picture' | 'picture-card'。
auto-upload: 是否自动上传文件
http-request: 覆盖默认的 Xhr 行为,允许自行实现上传文件的请求
disabled: 是否禁用上传
limit: 允许上传文件的最大数量
abort: 取消上传请求
submit: 手动上传文件列表
clearFiles: 清空已上传的文件列表(该方法不支持在 before-upload
中调用)
handleStart: 手动选择文件
handleRemove: 手动移除文件。 file
和rawFile
false
가 반환되거나 Promise
가 반환되어 거부되면 삭제됩니다. 멈출 것이다. . before -upload
에서는 지원되지 않음) 🎜🎜🎜🎜handleStart: 수동으로 파일 선택 🎜🎜🎜🎜handleRemove: 수동으로 파일 제거 . file
및 rawFile
이 병합되었습니다. 🎜🎜🎜🎜이미지 업로드 구현🎜🎜이미지를 업로드할 때 일반적으로 http 요청을 다시 작성하고 요청에 대한 기본 동작을 사용하지 않으므로 해당 동작은 일반적으로 ‘#’로 설정됩니다. 🎜<template> <div> <el-upload action="#" :headers="headers" :list-type="listType" :http-request="uploadAction" :on-exceed="handleExceed" :on-remove="handleRemove" :before-upload="beforeUpload" :on-success="uploadSuccess" :on-error="uploadError" :on-progress="uploadProgress" :file-list="fileListCopy.data" ref="upload" :multiple="true" :limit='limit' :disabled="disabled" :data="paramData" > <el-icon><Plus /></el-icon> <template #file="{ file }"> <div> <img :src="file.url" alt="" /> <span class="el-upload-list__item-actions"> <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)" > <el-icon><zoom-in /></el-icon> </span> <span class="el-upload-list__item-delete" @click="handleRemove(file)" > <el-icon><Delete /></el-icon> </span> </span> </div> </template> </el-upload> <el-dialog v-model="previewVisible"> <img w-full :src="dialogImageUrl" alt="Preview Image" /> </el-dialog> </div> </template> <script> export default { name: 'uploadImg' } </script> <script setup> import { Delete, Plus, ZoomIn } from '@element-plus/icons-vue'; import { reactive, ref, defineProps, defineEmits, computed, getCurrentInstance } from 'vue'; import { ElMessage } from 'element-plus'; const props = defineProps({ // 允许上传文件件的最大数量 limit:{ type:Number }, // 是否禁用上传 disabled:{ type:Boolean, default:false }, // 文件列表类型 listType:{ type:String, default:'picture-card' }, // 上传时携带的额外参数 paramData: { type:String } }); const emits = defineEmits([]); const cns = getCurrentInstance(); const globObj = cns.appContext.config.globalProperties; const previewVisible = ref(false); const dialogImageUrl = ref(''); const fileListCopy = reactive({ data: [] }); const onece = ref(false); const myChangeFile = ref(''); const changeFileIndex = ref(-1); const uploadImgArr = reactive({ data: [] }); const headers = reactive({}); // 预览大图 const handlePictureCardPreview = (uploadFile) => { dialogImageUrl.value = uploadFile.url; previewVisible.value = true; }; // 移除图片 const handleRemove = (file, fileList) => { console.log('handleRemove', handleRemove); console.log('file', file); console.log('fileList', fileList); fileListCopy.data = fileListCopy.data.filter(v => v.uid !== file.uid); }; // 文件上传数量限制 const handleExceed = (files, fileList) => { if (props.limit) { ElMessage.error(`只能上传${props.limit}张图片`); } console.log('handleExceed', handleExceed); console.log('files', files); console.log('fileList', fileList); }; // 上传请求 const uploadAction = (option) => { let formData = new FormData(); const url = ''; globObj.$axios({ url: url, method: 'post', transformRequest: [function(data, headers) { // 去除post请求默认的Content-Type delete headers['Content-Type'] return data }], data: formData, timeout: 300000 }).then(res => { ElMessage.success('资产添加成功'); }).catch((err) => { console.log(err); }); } // 格式大小的限制 const beforeUpload = (file) => { let isJPG = false, fileType = file.type.split('/')[0]; if(file.type === "image/jpeg" || file.type === "image/png") { isJPG = true; } else { isJPG = false; } const isLt2M = file.size / 1024 / 1024; if (fileType != 'image' || isLt2M > 2) { ElMessage.error("请上传2M以内的图片文件!"); return false } return true; }; // 文件上传成功时的钩子 const uploadSuccess = (response, file, fileList) => { // 上传成功之后后台返回的数据 console.log('uploadSuccess', uploadSuccess); }; const uploadProgress = (e, file, fileList) => { console.log('uploadProgress', uploadProgress) }; const uploadError = (err, file, fileList) => { console.log('uploadError', uploadError); }; </script>🎜기존 함정🎜🎜일반적으로 파일을 업로드할 때 요청 헤더의 Content-Type: multipart/form-data 요구 사항에서는 파일의 임의 번호도 설정해야 하므로 요청 헤더가 필요합니다. 콘텐츠 유형: multipart /form-data; 경계=----WebKitFormBoundarypzSlbADtTRuFx5FC. 🎜🎜제가 겪었던 문제는 다음과 같습니다. 🎜🎜질문 1🎜🎜Content-Type: 현재 multipart/form-data가 설정되어 있으며 요청에는 임의의 숫자 경계가 없습니다=----WebKitFormBoundarypzSlbADtTRuFx5FC. 🎜🎜글로벌 콘텐츠 유형을 설정하면 업로드 인터페이스 설정 multipart/form-data가 작동하지 않는 것을 알 수 있습니다. 경계가 없기 때문에 서버 500에서는 업로드가 실패해야 합니다. 🎜🎜그런 다음 수동으로 Boundary를 추가하려고 했습니다. 이번에는 오류가 400으로 변경되었습니다. 🎜🎜질문 2🎜🎜 나중에 데이터를 쿼리한 결과 Content-Type: multipart/form-data를 설정할 필요가 없다고 했습니다. ; 매개변수가 formData 형식인 경우 브라우저는 자동으로 요청 헤더의 Content-Type을 Content-Type으로 변환합니다: multipart/form-data; 경계=----WebKitFormBoundarypzSlbADtTRuFx5FC. 🎜🎜하지만 설정하지 않으면 기본적으로 application/json이 됩니다. 🎜🎜그래서 정보를 확인한 결과 axios의 변환 요청 속성이 요청 데이터를 서버로 보내기 전에 수정할 수 있다는 것을 알았습니다. 요청이 기본 게시 요청 방법에 있을 때 Content-Type 값이 application/json이기 때문입니다. 기본값을 제거해야 하므로 브라우저가 자동으로 이를 추가합니다. 🎜
globObj.$axios({ url: url, method: 'post', transformRequest: [function(data, headers) { // 去除post请求默认的Content-Type delete headers['Content-Type'] return data }], data: formData, timeout: 300000 }).then(res => { ElMessage.success('资产添加成功'); }).catch((err) => { console.log(err); });🎜질문 3🎜🎜다른 매개변수를 전달하려면 다른 매개변수도 추가해야 합니다. 그렇지 않으면 매개변수 오류가 보고될 수 있습니다. 🎜아아아아
위 내용은 el-upload를 사용하여 vue3에서 파일을 업로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!