vue+mongoose+node.js项目总结第一篇_图片文件上传

一、前言

项目演示:每个新用户登录之后会有个默认的头像,用户可以根据自己选择自己的头像图片进行更改。

二、主要内容

1、需求实现的思路分析。

第一步:用户点击按钮选择图片其实是间接触发input图片选择

第二步:input表单被监听change事件

第三步:选择图片,然后将图片用canvas画在预览框处

第四步:点击“确定按钮”,请求后端接口配合云存储,将图片上传到云存储上

第五步:利用云存储器中生成的图片url地址替换掉原来的地址

2、具体实现

     2.1总体思路

 2.2前台实现部分

(2)chooseImg(): 如上面所示这里用了一个小技巧点击下面的“选择图片”按钮,间接点击input输入框

//间接点击input框
chooseImg(){
                var avater = this.$refs.avater //input框
                avater.click() //input框点击
                avater.click() //这里要设置两次才有用
    },

(3)changeImg($event)这个函数监听到了input的图片发生了改变 , 注意:如果changeImg(e) 这样写获取不到事件e对象,改为changeImg($event)这样获取试试

//changeImg()函数将选中的图片绘制到页面中
            changeImg(event){
                console.log(111)
        var files = event.target.files

                if(files.length===0){//没有选中
                 return;
                }

                var imgPreview//新建一个缓冲区象允许Web应用程序异步读取存储在用户计算机上的文件。
                var length = files.length
                for(let i=0; i<length; i++){
                    this.file = files[i]
                    imgPreview = new FileReader()
                    if(this.file.size > this.maxSize){//规定了一个图片大小的最大上限
                        Toast(‘图片太大,不允许上传‘)
                        return;
                    }
                }
                //加载选中的图片
                imgPreview.onload=(event)=>{
                   let newimg = new Image()
                   newimg.onload = ()=>{//图片预览
                       //创建画布
                       let canvas = document.createElement(‘canvas‘)

                       let ctx = canvas.getContext(‘2d‘)
                       let width = newimg.width
                       let height = newimg.height

                       //设置画布的大小
                       canvas.width = width;
                       canvas.height = height
                       ctx.drawImage(newimg, 0, 0, width, height)

                       let newimgUrl = canvas.toDataURL(‘image/png‘)//方法返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi。
                       this.avater = newimgUrl
                       console.log(this.avater)
                   }

                   newimg.src = event.target.result;

                }
                 imgPreview.readAsDataURL(this.file)//readAsDataURL 方法会读取指定的 Blob 或 File 对象。读取操作完成的时候,readyState 会变成已完成DONE

            },

(4)点击“确定”上传图片

    //确定更新
            upDateOk(){
                if(!this.file){
                    Toast(‘请选择新的头像‘)
                    return
                }
            //    Indicator.open(‘头像更新中...‘)
                let self = this
                let param = new FormData()//FormData对象用以将数据编译成键值对
                param.append(‘username‘,this.userInfo._id)
                param.append(‘avater‘,this.file)
                console.log(param)
                if(this.userInfo.avater!== ‘http://localhost:4000/public/images/ava.jpg‘){//如果用户的头像不是默认的那一张头像也需要将当前的这一张头像的地址传过去
                    param.append(‘oldVal‘, this.userInfo.avater)
                }
                let headers = {
                    headers:{
                        "Content-Type": "application/x-www-form-urlencoded"
                    }
                }
                //请求更新头像的方法
                self.$axios.post(‘/api/upload/uploadAvater‘,param, headers).then(function(result){
                     self.$router.push({path: ‘/home‘});
                     Indicator.close();
                     Toast(result.data.msg)
                })
            }

        }

2.3后端node.js实现部分

        (1)第一步:需要去云存储器上去申请账号和密码,创建存储桶,会生成需要用到的密匙(百度步骤很多)

        (2)参考阿里云辅助文档:https://help.aliyun.com/document_detail/111265.html?spm=a2c4g.11186623.6.1239.45af2778FtkZdG

阿里云上借助的put方法实现上传功能,方法如下:

(3)multer标签实现的图片上传,所以需要安装multer

var fileName
var filePath
let Storage = multer.diskStorage({//diskStorage()方法指定文件存储的文件路径或者文件名
    destination: function (req, file, callback) {//计算图片存放地址
        callback(null, ‘./public/images‘);
    },
    filename: function (req, file, callback) {//图片文件名
        fileName = Date.now() + ‘_‘ + parseInt(Math.random() * 1000000) + ‘.png‘;
        filePath = ‘./public/images/‘ + fileName;
        callback(null, fileName)
    }
});

let upload = multer({storage: Storage}).any()//接受一切上传的文件。文件数组将保存在 req.files。
let avater = multer({storage: Storage}).single(‘avater‘)//接受一个以 fieldname 命名的文件。这个文件的信息保存在 req.file。

(4)前端请求对应的后端接口,实现图片上传

router.post(‘/uploadAvater‘, function (req, res, next) {
    avater(req, res, function (err) {
        let username = req.body.username;//获取到当前用户的id
        console.log(username)
        let imgs;
        let oldVal = req.body.oldVal || ‘‘;
        if (oldVal) {
            oldVal = oldVal.replace(‘http://pfr020xzs.bkt.clouddn.com/‘, ‘‘);
            client.delete(oldVal, function (err) {
                if (err) {
                    console.log(err)
                }
            })
        }
        if (err) {
            return res.end(err);
        }
        let i = 0;
        let imgItem = req.file;
        let filePath = `./public/images/${imgItem.filename}`;

        //调用上面的put方法实现图片上传
        put(fileName,filePath,(result)=>{
            imgs = result.url;
            console.log(imgs)
            User.update({
                _id: username
            }, {
                avater: imgs
            }).then(() => {
                res.json({
                    code: ‘0‘,
                    msg: ‘上传成功‘
                });
            })
        });
    });
});

原文地址:https://www.cnblogs.com/xxm980617/p/11451767.html

时间: 2024-12-12 19:30:06

vue+mongoose+node.js项目总结第一篇_图片文件上传的相关文章

js 禁止表单提交的方法(文件上传)

添加图片上传的表单,在form 添加属性onsubmit,提交之前会执行其中的方法,若返回FALSE,不会提交,返回TRUE,才会提交 <form method="post" enctype="multipart/form-data" action="/UpLoad.ashx" onsubmit="return check()"> <input type="file" name="

js的FileReader实现图片文件上传、预览

js的FileReader实现图片文件上传.预览 FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Data URL的好处是,您不需要额外再发出一个HTTP 请求到服务器端取得额外的资料:而缺点便是,网页的大小可能会变大.它适合应用在内嵌小图片,不建议将大图像文件编码成Data URL来使用.您的图像文件不能够超过浏览器限定的大小,否则无法读取图像文件.1

【SSH网上商城项目实战13】Struts2实现文件上传功能

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说.为此,这篇文章详细介绍一下Struts2实现文件上传的功能. 1. 封装文件信息 我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件.文件类型和文件名.针对我们要传的图片,我们新建一个Model如下: public class FileImage { private File file; private String contentType; private String fi

resumable.js —— 基于 HTML 5 File API 的文件上传组件 支持续传后台c#实现

在git上提供了java.nodejs.c#后台服务方式:在这里我要用c#作为后台服务:地址请见:https://github.com/23/resumable.js 我现在visual studio的环境是2013,mvc4,framwork4.0:我们来看git上给出的c#示例: samples/DotNET/ 在文件中包含两个文件Controllers Models,在两个文件里各有一个文件: 我把他部署到自己项目里边,却没有达到自己预定的效果,我是这样更改的: 一.我先把我的类库项目调成

SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

依然是项目结构图和所需jar包图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/font/5a6L5L2T/fontsize/400/fil

js实现图片文件上传的心得

今天研究一下图片上存的一个实现方法,由于上周没写技术周记,这次一定要写好! 那么问题来了:PHP处理图片上传时要求JQ实现数据的交互,怎么办? 这里涉及到的一个logo上传的需求,根据radio选择是否更新logo,同时form表单将以js事件处理 <div class="comLogo sbox"> <div class="CLheader">公司logo:</div> <div class="ui-imgsel

Node.js基础:第一篇

目录 第一章:Node.js概述 1.1-前端为什么要学习Node.js 1.2-后端开发要做什么 1.3-前端为什么选择Node.js 1.4-Node.js是什么 第二章:Node.js环境搭建 2.1-下载安装 2.2-安装常见问题 2.3-PATH环境变量 第三章:Node.js快速入门 3.1-Node.js组成 3.2-Node.js牛试小刀 3.3-Node.js全局对象global 第一章:Node.js概述 1.1-前端为什么要学习Node.js 能够和后端程序员更加紧密的配合

Node.js入门教程 第一篇 (环境配置及概念原理)

Node.js 概念 Node.js本质上是使用Google的V8引擎制作出来的服务框架.V8本身是Google为了解决Chrome浏览器的性能问题而制作的前端引擎(开源).本身依托于浏览器引擎,这也是为什么Node.js使用的是前端的JavaScript语言编程. V8的诞生是Google为了解决JavaScript的性能问题,用了内联缓存和隐藏类技术实现的前端引擎.V8使用C++编写,也因此V8可以在C++项目中完美兼容使用. V8被Google使用在大多数产品中,如Chrome浏览器,安卓

上一篇写的文件上传,这一篇写文件上传中回报的错误,以及解决办法

文件上传不了,有以下几种情况: 1).form表单后面的enctype="multipart/form-data"没有,导致无法以流的形式写入. 2).第一条有的话,当点击提交的时候,直接返回strut中的error返回结果,没有fileerror提示或者提示文件太大. 原因:是因为你上传的文件或者图片大小位于struts中拦截器配置中文件大小限制的值(总)(<constant name="struts.multipart.maxSize" value=&qu