Maison > Article > interface Web > Comment utiliser el-upload pour télécharger des fichiers dans vue3
Le besoin de télécharger des fichiers est souvent rencontré lors du développement de projets. Dans cet article, nous présenterons en détail l'utilisation d'el-upload dans elementplus pour télécharger des fichiers.
Voyons d'abord quelles propriétés et événements el-upload peut configurer. Propriétés T
false
ou renvoie . Promesse
et est rejetée, le téléchargement s'arrêtera. 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
est renvoyé ou si Promise
est renvoyé et est rejeté, suppression. va s'arrêter. avant -upload
) 🎜🎜🎜🎜handleStart : sélectionner manuellement les fichiers 🎜🎜🎜🎜handleRemove : supprimer manuellement les fichiers . file
et rawFile
ont été fusionnés. 🎜🎜🎜🎜Mise en œuvre du téléchargement d'images🎜🎜Lors du téléchargement d'images, nous réécrivons généralement la requête http et n'utilisons pas l'action par défaut pour demander, l'action est donc généralement définie sur «#’. 🎜<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>🎜Pièges existants🎜🎜Généralement, lors du téléchargement d'un fichier, le Content-Type dans l'en-tête de la requête : multipart/form-data dans nos exigences, nous devons également définir le numéro aléatoire du fichier, donc l'en-tête de la requête doit être Content-Type : multipart /form-data ; border=----WebKitFormBoundarypzSlbADtTRuFx5FC. 🎜🎜Voici le problème que j'ai rencontré. 🎜🎜Question 1🎜🎜Content-Type : multipart/form-data est défini ; à ce stade, la requête n'a pas de limite de nombres aléatoires =----WebKitFormBoundarypzSlbADtTRuFx5FC. 🎜🎜Si vous définissez le type de contenu global, vous constaterez que le paramètre d'interface de téléchargement multipart/form-data ne fonctionne pas. Parce qu'il n'y a pas de limite, le téléchargement doit échouer avec le serveur 500. 🎜🎜Ensuite, j'ai essayé d'ajouter Boundary manuellement. Cette fois, l'erreur est passée à 400. 🎜🎜Question 2🎜🎜 Plus tard, après avoir interrogé les données, il a été dit qu'il n'était pas nécessaire de définir Content-Type : multipart/form-data. ; tant que le paramètre est sous la forme formData, le navigateur convertira automatiquement le Content-Type de l'en-tête de requête en Content-Type : multipart/form-data; 🎜🎜Mais si je ne le configure pas, ce sera application/json par défaut. 🎜🎜J'ai donc vérifié les informations et découvert que l'attribut transformRequest d'axios peut modifier les données de la requête avant de les envoyer au serveur. Parce que la valeur de Content-Type lorsque notre requête est dans la méthode de requête de publication par défaut est application/json, nous. Vous devez supprimer la valeur par défaut, le navigateur l'ajoutera donc automatiquement. 🎜
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); });🎜Question 3🎜🎜Si vous souhaitez transmettre d'autres paramètres, les autres paramètres doivent également être ajoutés, sinon des erreurs de paramètres peuvent être signalées. 🎜
const formData = new FormData(); formData.append('file', file); // 其他参数 formData.append('mailSys', mailSys);
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!