vue学习笔记:还不会上传文件,10分钟教会你使用input file上传文件

news2024/10/6 16:32:01

最近在写一个用户上传MP3文件到服务器的小案例,我写一个这样的界面:

 当用户点击input的时候,其实这里并不是input的样式,而是一个div将代替了input的原生样式,这样比较好看一点:

<div class="address">
        <span>选择文件:</span>
        <input type="file" placeholder="" ref="fileadd" @change="getfile" id="filePath">
        <div class="mask" @click="middlefile">{{ filename }}</div>
</div>

我就将input的opacity设置为0:

input {
            opacity: 0;
                    
            cursor: pointer;
}

将mask定位到我们想要的位置,然后通过mask的点击事件来触发input file的点击事件:

        middlefile() {

            this.$refs.fileadd.click()
        },

那么废话不多说,当我拿到这个文件的对象之后发给服务端如何实现?

  getfile(e) {
            this.currentfile = this.$refs.fileadd.files[0]
    }

其实很简单,就是通过axios发送一个formData表单请求就可以了:

comitmusic() {
            let musicform = {}
            this.musicfile.space = Math.round(this.currentfile.size / 10000) / 100 + 'MB'
           
            this.musicfile.url = this.currentfile.name
            musicform.musicinfo = this.musicfile
            musicform.file = this.currentfile
            let formData = new FormData()
            formData.append('file', this.currentfile)
            
            formmusicfile(formData).then(res => {
                if (res.data.state == 200) {
                    console.log(this.currentfile)
                    formData.append('info',JSON.stringify(musicform) )
                    this.$toast.show('文件下载成功', 2000)
                    formmusic(formData).then(res => {
                        if (res.data.state == 200) {
                            this.$toast.show('添加成功', 2000)
                        } else {
                            this.$toast.show(res.data.message)
                        }
                        console.log(res)
                    })

                } else {

                    this.$toast.show(res.data.message)
                }
                console.log(res)
            })


        }

当然我这里还有一些是用来获取MP3文件里面的详细信息的,比如作者、时长等,这里发了两个请求,可以看到两个then,一个是用发给后端来存放数据的,数据存储成功之后就发送第二个请求,将歌曲信息更新并且存入数据库;发送表单请求是因为可以容纳比较大的数据,如果使用json或者是参数的话是传不过去的,使用formdata这个对象,new 出来之后就通过append来放键值对进去,要注意,如果是传的普通对象,需要使用JSON.stringify(musicform)来进行转化,不然后台只会收到空对象{}; 文件对象不用管,因为它不需要在后端的回调函数里面使用,后面使用一个中间件就可以将文件获取并且存储下来;

先来看一下对axios的封装:

import axios from "axios"

export function request(config){
    const instance1  = axios.create({
        baseURL:'http://localhost:8089',
        timeout:30000
    })
    return instance1(config)
    
}

我是建议封装一下axios在使用,真的很方便,这里设置了一个访问时长,因为有时候会因为网卡而导致上传失败,接下来就是要发送请求的方法配置:

import {request} from '../network/request'



export function formmusic(dataload){
    
    console.log(dataload.get('file'))
    return request({
        url: '/music/load',
        method: 'post',
        headers:{
            "Content-Type": "multipart/form-data;",
            'Access-Control-Allow-Origin':'*',
            
        },
        data:dataload
    })

}
export function formmusicfile(dataload){
    return request({
        url: '/music/loadmusic',
        method: 'post',
        headers:{
            "Content-Type": "multipart/form-data;"
        },
        data:dataload
    })

}

配置好后端的URL和一些请求头、请求类型,提交的表单数据存放在data里面,注意这里不要写错了method,不是methods。

let express = require('express')
let router = express.Router()
let music = require('./api/music')
let members = require('./api/members')
const path = require('path')
const multipart = require('connect-multiparty');

const multipartyMiddleware = multipart();

 

const multer = require('multer')
let storage=multer.diskStorage({
	//设置存储路径
    destination:(req,file,cb)=>{
        //console.log("destination:",file);//打印结果如下图
        cb(null,'./resource/music');
    },
    //设置存储的文件名
    filename:(req,file,cb)=>{
        //console.log("filename:",file);//打印结果如下图
        //获取文件的扩展名
        let extname=path.extname(file.originalname);
        var musicfile = req.body
        console.log(musicfile)
        //let musicinfo = JSON.parse(musicfile.info).musicinfo

        filename=file.fieldname+extname;
        cb(null,filename);
    }
})
let upload=multer({storage});



router.post('/music/load', multipartyMiddleware, music.add)
router.post('/music/loadmusic',upload.single('file'),music.addfile)



module.exports = router

没错,就是通过这里的multer插件来将文件获取到并且存储下来,可以看到这里的第二个post请求使用了这个中间件upload.single('file');

可以使用:

npm i multer

来安装这个插件,然后按照上面的配置就行;但是有一个问题,他的文件名是无法按照文件的真实名字命名的,只有一个file名字,不过这怎么可能倒各位呢?这里我的方法是使用两个请求,另一个请求里就是专门做了一个重命名文件的操作,这里就这样配置是没有问题的,注意这里的路径不一定是各位服务器上的结构,按照自己的结构写;

然后就是解析formdata数据了,前面我传了一个formdata数据过来,文件解析了,但是还有一个歌曲的信息对象呢,前端通过formdata.get(键)可以获取到这个对象,但是后端如何获取呢?

各位是不是还在为拿到表单数据为空对象{}而苦闷不堪呢?今天我分享一个中间件,让你们摆脱它,其实前面已经给出了:

const multipart = require('connect-multiparty');
const multipartyMiddleware = multipart();
application.use(multipartyMiddleware)  

就是这个东西,当然也可以放到路由里面

router.post('/music/load', multipartyMiddleware, music.add)

好了,最后给大家看看我是如何更改file名称的:

exports.add = (req, res) => {        //向info表添加数据
    var sql2 = 'insert into musics (music,singer,time,space,position,img) values (?,?,?,?,?,?)'
    var sql1 = 'select * from musics where music = ?'
    var musicfile = req.body
    let musicinfo = JSON.parse(musicfile.info).musicinfo
    console.log(musicinfo)
    db.query(sql1, [musicinfo.music], (err, data) => {
        if (err) {
            return res.send('错误:' + err.message)
        }
        console.log(data.length == 0)
        if (data.length == 0) {
            console.log('执行')
            fs.rename('./resource/music/file.mp3', './resource/music/'+musicinfo.music + '.mp3', (error) => {
                if (error) {
                    return res.send('错误:数据重命名失败' + error.message)
                } else {
                    db.query(sql2, [musicinfo.music, musicinfo.singer, musicinfo.time, musicinfo.space, 'http://localhost:8089/resource/music/' + musicinfo.music + '.mp3', musicinfo.img], (err, data) => {
                        if (err) {
                            return res.send('错误:写入数据库失败' + err.message)
                        }

                        res.send({
                            status: 200,
                            message: '添加成功'
                        })
                    })
                }
            })

        } else {
            res.send({
                state: 500,
                message: '文件已存在!'
            })
        }
    })
}

温馨提示:写后端要特别注意数据格式的解析;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm 安装配置 pyQt5 图文操作(全)

目录前言1. 安装模块2. Pycharm 配置 pyQt52.1 配置QtDesigner2.2 配置PyUic2.3 配置pyrcc3. pyQt5界面前言 Qt是开源的GUI库&#xff0c;自带的QtDesigner 可以轻松构建界面&#xff0c;而且有非常全面的工具代码库和APIpyQt 是 Qt 库的Python版本&#xff0c;目前最新版本是…

数据库--------代数运算和关系运算

目录 传统的集合运算专门的关系运算例题1例题2关系代数的运算按运算符的不同可分为传统的集合运算和专门的关系运算两类。 传统的集合运算 并(∪): 差(-): 交(∩): 笛卡尔积():R的每一行S的矩阵 示例:

A-Level化学例题解析及练习(分子间作用力和沸点)

今日知识点&#xff1a;Intermolecular forces and boiling points 例题 Q: Nitrogen, N2, and carbon monoxide, CO, both have Mr 28. The boiling point of N2 is 77 K. The boiling point of CO is 82 K.What could be responsible for this difference in boiling point…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

LinkedList源码分析

LinkedList源码分析 注意:本笔记分析对象为 Java8 版本,随版本不同,源码会发生变化。 基本介绍与类图 LinkedList 同时实现了 List 接口和 Deque 对口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack)。 这样看来,linke…

能力提高篇--协调能力【对接】

作为一名安防技术支持工程师&#xff0c;正常情况下我们的日常主要为解决问题&#xff0c;然而对于重大项目或者复杂项目&#xff0c;更多的情况下我们的职责为收集客户需求&#xff0c;拉通研发侧评估&#xff0c;确认需求&#xff0c;确认程序交付时间&#xff0c;测试和最终…

基于jsp+mysql+ssm协同办公系统-计算机毕业设计

项目介绍 本公司文档协同办公管理系统采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发,主要包括系统用户管理模块、用户信息模块、文件信息管理、个人事务管理、资料信息管理、登录模块、和退出模块等多个模块. 本系统主要包含了等系统用户管理、用户信息管理…

蓝桥杯---动态规划(1)

动态规划专题&#xff08;1&#xff09;1.糖果&#xff08;状压dp&#xff09;2.调手表&#xff08;状压dp)3.矩阵计数(状压dp)4.蒙德里安的梦想&#xff08;状压dp模板题&#xff09;5.跳跃&#xff08;动态规划&#xff0c;搜索&#xff09;5.字符排序&#xff08;逆序对&…

如何定位慢查询SQL以及优化

&#x1f468;‍&#x1f4bb;个人主页&#xff1a; 才疏学浅的木子 &#x1f647;‍♂️ 本人也在学习阶段如若发现问题&#xff0c;请告知非常感谢 &#x1f647;‍♂️ &#x1f4d2; 本文来自专栏&#xff1a; MySQL ❤️ 支持我&#xff1a;&#x1f44d;点赞 &#x1f33…

个人健康监测小程序开发,多元化健康生态管理平台

生活水平的提升让人们对身体健康的关注度越来越高&#xff0c;健康生活的意识越来越浓烈。现在很多人的身体都处于一种亚健康的状态&#xff0c;因此需要定时进行体检&#xff0c;及时了解自身健康状况。但是由于工作或者其他原因&#xff0c;很多人都难以抽出时间到医院进行定…

Web3中文|“你们眼中的互联网革命,是我生活的日常”

来源 | coindesk 编译 | BoweniNFTnews.com 中心化产品会发生单点故障。 10月4日&#xff0c;社交网站Facebook遭遇六小时的网络中断&#xff0c;从其子公司 Instagram 和 Whatsapp 到其实体工厂都受到影响。 据称这是该社交网站有史以来最严重的一次服务中断。相关消息显示…

数据结构(7)树形结构——红黑树(概念、插入过程、删除过程)

7.1.概述 平衡二叉树是要求任意结点的左右子树高度差不超过1&#xff0c;因此在AVL中用旋转来保证树的绝对平衡&#xff0c;但是这些旋转操作步骤繁多很耗时间&#xff0c;所以在面对经常会有数据插入的场景时&#xff0c;AVL不是一个性能优秀的选择。这时候反过来思考一个问题…

图神经网络简介

本篇文章是我在2022年阅读完distill上一篇文章"A Gentle Introduction to Graph Neural Networks"后自己的一些心得。 目录 一、不同类型的数据如何以图的形式保存 二、图结构可以处理的问题 三、图机器学习的挑战 四、图神经网络 一、不同类型的数据如何以图的…

【智能优化算法-算术算法】基于算术优化算法 (MAOA)求解多目标优化问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Java并发编程—java中守护线程和用户线程

一、概念&#xff1a; ​ 守护线程&#xff1a;是一种特殊的线程&#xff0c;在后台默默地完成一些系统性的服务&#xff0c;比如垃圾回收线程 ​ 用户线程&#xff1a;是系统的工作线程&#xff0c;它会完成这个程序需要完成的业务操作&#xff1b;我们使用 Thread类创建的线…

求先序遍历序列中第(1<=k<=二叉树中结点个数)个结点的值

本题本质上就是一个遍历算法的实现&#xff0c;只不过用一个全局变量的来记录访问的序号&#xff0c;求其他遍历序列的第k个结点也采用相似的方法。二叉树的遍历算法可以引申出大量的算法题&#xff0c;因此考生务必熟练掌握二叉树的遍历算法。 C语言代码&#xff1a; //本题本…

mapbox地图动画一键飞行

最近&#xff0c;Mapbox GL JS 从 v2.9 开始支持将地图显示为 3D 地球。 话不多说&#xff0c;马上看看效果怎么样&#xff1a; mapbox地图动画我们通过设置投影属性projection&#xff1a;globe&#xff0c;即可将地图更改为地球 const map new mapboxgl.Map({container: m…

mybatis实战:二、mybatis xml 方式的基本用法

注释都在代码里&#xff0c;最好复制了再看&#xff01; 1.创建表 CREATE TABLE sys_user( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 用户 ID, user_name VARCHAR(50) COMMENT 用户名, user_password VARCHAR(50) COMMENT 密码, user_email VARCHAR(50) COMMENT 邮箱, user…

manjaro 记录 1 安装流程

manjaro 记录 1 安装流程 初manjaro 记录 1 安装流程下载好镜像镜像写入U盘重启电脑&#xff0c;进入U盘安装进入界面&#xff1a;找到 launch installer 进行安装安装流程设置语言设置位置与时区设置键盘磁盘分区设置用户与管理员密码安装初 希望能写一些简单的教程和案例分享…

Flink JobManager 内存占用大 问题

Flink JobManager 内存占用大问题 问题描述 当在 本地启动一个 flink 简单的 job 时候&#xff0c;发现出现了 heap outMemeory 问题&#xff0c; 然后就不假思索的 调整了 jvm 的 heap -Xms1000m -Xmx16000m 参数&#xff0c;就可以正常的启动了。 通过 jvisualvm 连接上 这…