vue中文件上传通过axios把文件传入到后台

<template>
	<div>
		<div class="bigImgupdate-div" ref="Pname" @click="toGetImg">
			<img class="bigImgupdate" @click="toGetImg"  :src=valueUrl v-if="valueUrl">
		</div>
		<div>
			<p>照片名称:{{Pname}}</p>
		</div>
	</div>
</template>

<script>
	import axios from 'axios'
	import store from '../store/index.js'
	let inputElement = null
	export default {
		props: ['gids'],
		data() {
			return {
				valueUrl: '',
				valueBase: '',
				Pname: '',
				test: '子组件里的值',
			}
		},
		computed: {

		},
		mounted() {

		},
		components: {

		},
		methods: {
			toGetImg() {
				if (inputElement === null) {
					// 生成文件上传的控件
					inputElement = document.createElement('input')
					inputElement.setAttribute('type', 'file')
					inputElement.style.display = 'none'
					if (window.addEventListener) {
						inputElement.addEventListener('change', this.uploadFile, false)
					} else {
						inputElement.attachEvent('onchange', this.uploadFile)
					}
					document.body.appendChild(inputElement)
				}
				inputElement.click()

			},
			uploadFile(el) {
				if (el && el.target && el.target.files && el.target.files.length > 0) {
					const files = el.target.files[0]
					const isLt2M = files.size / 1024 / 1024 < 2
					const size = files.size / 1024 / 1024
					// 判断上传文件的大小
					if (!isLt2M) {
						this.$message.error('上传头像图片大小不能超过 2MB!')
					} else if (files.type.indexOf('image') === -1) { //如果不是图片格式
						// this.$dialog.toast({ mes: '请选择图片文件' });
						this.$message.error('请选择图片文件');
					} else {
						const that = this;
						const reader = new FileReader(); // 创建读取文件对象
						reader.readAsDataURL(el.target.files[0]); // 发起异步请求,读取文件
						reader.onload = function() { // 文件读取完成后
							//读取完成后,将结果赋值给img的src
							this.valueBase = this.result.replace(/^data:image\/\w+;base64,/, "");
							that.valueUrl = 'data:image/png;base64,' + this.valueBase;
							// 数据传到后台
							const formData = new FormData()
							formData.append('file', files); // 可以传到后台的数据
							that.Pname = files.name;
							that.$emit("onclickupload", files.name);
							axios.post("api/limited/upload", {
									photo: this.valueBase,
									name: files.name,
								}, {
									headers: {
										tokenStr: store.state.token,
									}
								})
								.then(res => {
									if (res.data.code == 201) {
										that.$message({
											message: '文件已传输成功',
											type: 'success'
										});
									} else if (res.data.code == 202) {
										that.$message({
											type: 'info',
											message: '文件传输失败'
										});
									}

								})
								.catch(err => {
									console.log("传输失败", err)
								})
						};
					}
				}
			},
		},
		beforeDestroy() {
			if (inputElement) {
				if (window.addEventListener) {
					inputElement.removeEventListener('change', this.onGetLocalFile, false)
				} else {
					inputElement.detachEvent('onchange', this.onGetLocalFile)
				}
				document.body.removeChild(inputElement)
				inputElement = null
				/* console.log('========inputelement destroy') */
			}
		}

	}
</script>

<style>
	.bigImgupdate-div {
		width: 100px;
		height: 100px;
		overflow: hidden;
		border: 1px solid #ddd;
	}

	.bigImgupdate {
		display: block;
		width: 100px;
		height: 100px;
	}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值