vue结合element实现自定上传图片到后端数据库功能

使用element组件库


<el-row>
    <el-col :span="3" :offset="1">
        图片跳转链接
    </el-col>
    <el-col :span="6">
        <el-input
          v-model="imgLink"
        >
        </el-input>
    </el-col>
</el-row>
<el-row>
    <el-col
    :span="16"
    :offset="1">
        <el-upload
            ref="uploadImg"
            list-type="picture"
            :file-list="fileList"
            accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
            :action="upLoadUrl"
            :before-upload="onBeforeUploadImg"
            :http-request="uploadRotationImage"
            :on-change="fileChange"
        >
        <el-button
          size="small"
          type="primary"
        >选择文件上传</el-button>
        </el-upload>
    </el-col>
</el-row>


srcipt文件


<script lang="ts">
interface fileIndex{
           name:any;
          url:any
      }

export default class FirstPage extends Vue{
      private upLoadUrl="http://xxx"; //上传图片后端接口地址
         private imgLink='';
      private fileList:fileIndex={ name:'', url:'' };
	 private onBeforeUploadImg(file:any){
		//图片上传前图片大小和类型判断
		const isImg = file.type === 'image/jpeg'|| 'image/jpg' || 'image/png';
		const isSize = file.size/1024/1024 <1;
		if(!isImg){
		    this.$message.error('上传文件只能是图片格式!');
		}
		if(!isSize){
			this.$message.error('上传图片不能超过1MB!');
		}
		return isImg && isSize
	}
	private uploadRotationImage(param:any){
		// 上传轮播图接口
		const formData = new FormData();
		formData.append('upload',param.file);
		formData.append('urlLink',this.imgLink);
		const upload = param.file;    //图片文件参数
		const urlLink =this.imgLink;    //项目需要的另一个与文件对应的跳转链接参数
		operateDataBaseApi
			.uploadRotationImg({
				formData
			})
			.then(res =>{
				if(res.data.code===200){
					console.log("添加轮播图片成功");
				}else{
					console.log('添加轮播图片失败',res.data.message);
				}
			})
			.catch(
				err =>{
					console.log('添加轮播图片失败catch',err.message);
				}
			)
	}
	private fileChange(file:any){
		//更新文件列表数据,文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
		this.fileList=
			{
				name:file.name,
				url:file.url
			}
		;
		console.log('上传的文件列表fileList',this.fileList)
	}
   }
</script>

axios请求配置


import axios from 'axios'
import qs from 'qs'    //需要先安装qs模块
const http = axios.create({
    // 设置超时时间
    timeout: 180000,
    // baseURL: 'http://10.2.15.54:8111', // api的base_url
    baseURL:process.env.VUE_APP_BASE_API,
    responseType: 'json',
    headers: { 'Content-Type': 'application/json'
        },
});
http.defaults.transformRequest = (data, config) => {
    // 在向服务器发送前,修改请求数据
    if(!config['Content-Type']) return qs.stringfy(data);
    switch(config['Content-Type'].toLowerCase()){
        case 'application/json':{
            //将javascript对象格式的请求数据转换为JSON格式再发送到服务器
            return JSON.stringify(data)
        }
        case'multipart/form-data':{
            //返回表单数据formData的键值对,
            return data.formData
        }
        default:{
            return qs.stringfy(data)
        }
    }
}
uploadRotationImg(data:any){
    //轮播图上传接口
    return http({
        method:'post',
        url:`/imgs/uploadRotationImg`,
        headers:{
            'Content-Type': 'multipart/form-data',
        },
       data
    })
},

http请求配置说明


首先,http请求头的'Content-Type'应该设置为'multipart/form-data'。在向服务器发送formData数据时,如果在发送请求前没有修改请求数据,则发送数据直接就被qs进行序列化了,则FormData的内容无法被序列化,此时返回的data就是一个空的内容,从而导致请求失败。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Element-Plus上传图片后端,你需要使用一个后端框架(如Node.js)来接收和处理上传的文件,并将其保存在服务器上。在Vue3中,你可以使用Element-Plus的Upload组件来实现这一点。以下是一个简单的例子: ```html <template> <el-upload action="/upload" :on-success="handleSuccess" :file-list="fileList" list-type="picture"> <el-button slot="trigger">选择图片</el-button> </el-upload> </template> <script> import { ref } from 'vue'; export default { setup() { const fileList = ref([]); const handleSuccess = (response) => { // 处理上传成功的结果 console.log(response); }; return { fileList, handleSuccess }; } }; </script> ``` 在这个例子中,我们使用了`el-upload`组件来创建一个文件上传的界面。`action`属性指定了上传文件的路径,`on-success`属性指定了上传成功后的回调函数,`file-list`属性指定了要上传的文件列表,`list-type`属性指定了上传的文件类型。 在后端,你需要使用一个接收上传文件的路由。以下是一个使用Express.js框架的示例: ```javascript const express = require('express'); const app = express(); const multer = require('multer'); // 配置文件上传的路径和文件名 const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, Date.now() + '-' + file.originalname) } }) // 创建上传对象 const upload = multer({ storage: storage }) // 处理文件上传的路由 app.post('/upload', upload.single('file'), (req, res) => { console.log(req.file); res.send('文件上传成功'); }); app.listen(3000, () => { console.log('服务器已启动,监听端口3000'); }); ``` 在这个例子中,我们使用了`multer`库来处理文件上传。`destination`属性指定了文件上传的路径,`filename`属性指定了上传文件的文件名。`upload`对象创建了一个文件上传的中间件,`upload.single('file')`指定了要上传的文件名。当文件上传成功后,`req.file`对象将包含上传的文件信息,我们可以将其保存到数据库或其他地方。 这就是使用Element-Plus上传图片后端的简单示例。当然,实际情况可能更加复杂,你需要根据自己的需求来进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值