Upload 上傳文件
element-ui官網(wǎng)
element ui=>upload上傳組件
Upload 上傳文件這個功能是我們在企業(yè)實際開發(fā)當(dāng)中使用頻率是非常高的這樣一個文件上傳的功能,,element ui組件組也給我們提供了上傳的組件。所有我們一定要熟悉掌握它
使用之前先進(jìn)行一下element ui的安裝和配置
打開終端=>輸入npm i element-ui -S
npm i element-ui -S
就拿其中的一個拖拽上傳一個例子進(jìn)行說說吧
el-upload拖拽上傳官網(wǎng)源代碼
<el-upload
class="upload-demo"
drag
action="https://jsonplaceholder.typicode.com/posts/"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">將文件拖到此處,或<em>點擊上傳</em></div>
<div class="el-upload__tip" slot="tip">只能上傳jpg/png文件,且不超過500kb</div>
</el-upload>
接下來咱們就創(chuàng)建一個vue組件進(jìn)行使用和講解
1.先搭建一個vue項目
vue項目搭建可以參考這篇文章
2.使用element-ui和創(chuàng)建vue組件
配置element-ui
main.js
import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'
// 引入element ui
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.config.productionTip = false
Vue.use(ElementUI);
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})
創(chuàng)建一個組件,用于放el-upload
upload.vue,首先先把element的組件放進(jìn)來,接下來再進(jìn)行更改配置
<template>
<div>
<el-upload class="upload-demo" drag action="https://jsonplaceholder.typicode.com/posts/" multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">將文件拖到此處,或<em>點擊上傳</em></div>
<div class="el-upload__tip" slot="tip">只能上傳jpg/png文件,且不超過500kb</div>
</el-upload>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style scoped></style>
展示upload組件,為了方便我就不配置路由了,直接在App.vue引入展示
App.vue
<template>
<div id="app">
<uploadView/>
</div>
</template>
<script>
// 引入創(chuàng)建的upload.vue組件
import uploadView from './views/upload.vue'
export default{
components:{
uploadView
}
}
</script>
<style scope>
</style>
首次展示效果
el-upload參數(shù)講解
文件上傳
使用el-upload組件完成,action 是后端地址,是后端請求的接口地址。
常用參數(shù):
- action 后臺路徑,前端負(fù)責(zé)手機(jī),然后傳給后臺,比如存到數(shù)據(jù)庫等等
- div class=“el-upload__text”
- div class=“el-upload__tip” slot=“tip”
div的文字自己根據(jù)需求可以自行更改
圖片上傳
imgUpload圖片上傳組件封裝
<template>
<div>
<!-- 圖片上傳 -->
<el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/" :show-file-list="false"
:on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
</template>
<script>
export default {
data() {
return {
imageUrl: ''
// 接受我們上傳圖片的地址,上傳成功以后給的地址
};
},
methods: {
// 上傳成功的回調(diào)
handleAvatarSuccess(res, file) {
//demo 轉(zhuǎn)換成url,后期可以換成后端給我們返回的地址
this.imageUrl = URL.createObjectURL(file.raw);
// 轉(zhuǎn)化可以顯示頁面的地址,其實正常開發(fā)中已經(jīng)可以拿到后端返回的地址,可以直接使用的
},
// 上傳之前的回調(diào)
beforeAvatarUpload(file) {
// isJPG圖片格式是否符合我們的規(guī)定
const isJPG = file.type === 'image/jpeg';
// isLt2M 文件大小是否符合我們的規(guī)定
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isJPG) {
this.$message.error('上傳頭像圖片只能是 JPG 格式!');
}
if (!isLt2M) {
this.$message.error('上傳頭像圖片大小不能超過 2MB!');
}
return isJPG && isLt2M;
}
}
}
</script>
<style scoped>
/* 圖片上傳樣式 */
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
line-height: 178px;
text-align: center;
}
.avatar {
width: 178px;
height: 178px;
display: block;
}
</style>
把App.vue展示的組件替換為我們的imgUpload組件
<template>
<div id="app">
<!-- 文件上傳 -->
<!-- <uploadView/> -->
<!-- 圖片上傳 -->
<imgUpload/>
</div>
</template>
<script>
// 引入創(chuàng)建的upload.vue組件
// 文件上傳
import uploadView from './views/upload.vue'
// 圖片上傳
import imgUpload from './views/imgUpload.vue'
export default{
components:{
uploadView,
imgUpload
}
}
</script>
<style>
</style>
el-upload 常用屬性
- action可以根據(jù)我們的需求改為后端地址
- headers 設(shè)置上傳的請求頭部
- method 設(shè)置上傳請求方法
- multiple 是否支持多選文件
- disabled 是否禁用上傳
- data 上傳時附帶的額外參數(shù)
- name 上傳的文件字段名
- limit 允許上傳文件的最大數(shù)量
- with-credentials 支持發(fā)送cookie憑證信息
- show-file-list 是否顯示已上傳文件列表
- accept 接受上傳的文件類型
- drag 是否啟用拖拽上傳
- on-success 上傳成功的回調(diào)
- before-upload 準(zhǔn)備上傳的回調(diào)
- list-type列表展示的形式或者類型 text/picture/picture-card
- list-type: 文件列表的類型,‘text’ | ‘picture’ | ‘picture-card’。
- auto-upload 是否自動上傳文件
- file-list/v-model:file-list 默認(rèn)上傳文件
- http-request 覆蓋默認(rèn)的 Xhr 行為,允許自行實現(xiàn)上傳文件的請求
- on-success 文件上傳成功時的鉤子
- on-error 文件上傳失敗時的鉤子
- on-progress 文件上傳時的鉤子
- on-change 文件狀態(tài)改變時的鉤子,添加,上傳成功和失敗都會被調(diào)用
- on-exceed 當(dāng)超出限制時執(zhí)行的鉤子
- before-upload 文件上傳之前的鉤子,參數(shù)為上傳的文件, 若返回false或者返回 Promise 且被 reject,則停止上傳。
- before-remove 刪除文件之前的鉤子,參數(shù)為上傳的文件和文件列表, 若返回 false 或者返回 Promise 且被 reject,則停止刪除。
- abort 取消上傳請求
- submit 手動上傳文件列表
- clearFiles 清空已上傳的文件列表(該方法不支持在 before-upload 中調(diào)用)
- handleStart 手動選擇文件
- handleRemove 手動移除文件。 file 和rawFile 已被合并。
- on-preview 查看按鈕=>對應(yīng)一個回調(diào),回調(diào)參數(shù)對應(yīng)我們當(dāng)前點擊的文件 官方點擊文件列表中已上傳的文件時的鉤子
handlepreview (file)
- on-remove 刪除按鈕=>對應(yīng)一個回調(diào),回調(diào)參數(shù)對應(yīng)我們當(dāng)前點擊的刪除的文件和剩余的文件列表 文件列表移除文件時的鉤子
handleremove (file,filelist)
更多的查看官網(wǎng)即可
踩坑
- 設(shè)置了Content-Type: multipart/form-data;此時請求一直沒有隨機(jī)數(shù)boundary=----WebKitFormBoundarypzSlbADtTRuFx5FC。
如果設(shè)置了全局的content-type,會發(fā)現(xiàn)上傳接口設(shè)置multipart/form-data是不起作用的,因為沒有Boundary,所以上傳必定失敗,服務(wù)器500。
然后嘗試手動添加Boundary,這次錯誤變400了 - 后來通過查詢資料,說不用設(shè)置Content-Type: multipart/form-data;只要參數(shù)是formData形式,瀏覽器就會自動將請求頭的Content-Type轉(zhuǎn)成Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypzSlbADtTRuFx5FC。
但是我不設(shè)置的話就是默認(rèn)的application/json。
于是查閱資料發(fā)現(xiàn)axios的transformRequest屬性可以在向服務(wù)器發(fā)送請求數(shù)據(jù)之前修改請求數(shù)據(jù),因為我們的請求在默認(rèn)的post請求方式時Content-Type的值是application/json,需要去掉默認(rèn)的值,這樣瀏覽器就可以自動添加了。
globObj.$axios({
url: url,
method: 'post',
transformRequest: [function(data, headers) {
// 去除post請求默認(rèn)的Content-Type
delete headers['Content-Type']
return data
}],
data: formData,
timeout: 300000
}).then(res => {
ElMessage.success('資產(chǎn)添加成功');
}).catch((err) => {
console.log(err);
});
如果還要傳其他的參數(shù),其他的參數(shù)必須也要append進(jìn)去,否則可能會報參數(shù)錯誤。文章來源:http://www.zghlxwxcb.cn/news/detail-665131.html
const formData = new FormData();
formData.append('file', file);
// 其他參數(shù)
formData.append('mailSys', mailSys);
總結(jié)
如果這篇【文章】有幫助到你??,希望可以給我點個贊??,創(chuàng)作不易,如果有對前端端或者對python感興趣的朋友,請多多關(guān)注??????,咱們一起探討和努力?。?!
????? 個人主頁 : 前端初見文章來源地址http://www.zghlxwxcb.cn/news/detail-665131.html
到了這里,關(guān)于el-upload 文件上傳組件的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!