上传(图片)文件的功能实现

说句实话,现在的开发简单多了。因为有现成的第三方的上传文件的代码。如果放在我们以前做开发,上传文件的代码都得自己写。

那现在的程序员面对上传文件的功能到底写啥代码。

1)、对于前端人员:就是把后端的请求地址,请求方式,要传的文件对象(选择的文件)写好。

2)、对于后端人员:只需要把接收的文件做重命名,修改位置,图片地址保存的数据库,再把图片地址响应给前端就行。

你看看,是不是上传文件是怎么上传的核心部分我们根本不用去关注。

话不多说,上干货。

本文后端使用nodeJS,第三方模块使用multer。再用了一点点jQuery。

示例:注册功能的上传头像。

1、前端选择文件并发送请求 -> 后端接收到文件本身 -> 保存到服务器(硬盘)上 --->对文件进行重命名,并加上扩展名,--->把路径响应给前端---->前端把路径放在img标签的src属性

2、注册时,把前端拿到图片路径要发给后端,后端保存到数据库中。

一、前端代码:
javascript 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>注册页面</title>
</head>

<body>
    <div>
        <h1>注册页面</h1>
        <img id="selectfile" src="./images/defaultHeader.png" style="width: 100px; height: 100px;">
        <input id="inputfile" type="file" style="display: none;">
        <p>
            手机号:
            *<input type="text" id="userphone">
            <span id="phoneMsg"></span>
        </p>
        <p>
            密码:
            <input type="text" id="userpass" placeholder="长度6-16位,由数字,字母,下划线">
            <span id="passMsg"></span>
        </p>
        <p>
            确认密码:
            <input type="password" id="userpass2">
            <span id="pass2Msg"></span>
        </p>
        <p>
            <input type="button" value="注册" id="btnRegister">
            <span id="errMsg"></span>
        </p>
    </div>
</body>

</html>
<script src="./js/jquery.js"></script>
<script>

    let headerPath = "";

    window.onload = function () {
        // 点击图片,调用 input type=file 标签的click事件
        $("#selectfile").on("click", function () {
            document.getElementById("inputfile").click();//触发onclick事件。
        })

        // onChange事件:当选择的文件发生变化时触发
        document.getElementById("inputfile").onchange = function () {
            console.log("选择了新的文件");
            // 上传图片
            var formData = new FormData();
            // 通过formData定义参数格式。
            // formData.append("参数名",参数值)
            formData.append('photo', document.getElementById('inputfile').files[0]);

            // $.ajax() 是jQuery封装好的ajax函数。
            $.ajax({
                url: "/uploadajax",
                type: "post",
                data: formData,
                contentType: false,
                processData: false,
                success: function (res) {
                    console.log("后端响应的内容",res);
                    console.log("res.path",res.path);
                    document.getElementById("selectfile").src=res.path;
                    headerPath = res.path
                }
            });
        };
   
        // 注册按钮
        document.getElementById("btnRegister").onclick = register;
        
        function register() {
        	//为了减少篇幅,省去了注册功能的代码    
        }
    }

</script>
二、后端代码:

1、用express搭建项目(用express脚手架)

javascript 复制代码
express -e 项目名

2、安装第三方模块:multer:

javascript 复制代码
npm i multer@1.4.5-lts.1 --save

我用的版本:"multer": "^1.4.5-lts.1"

3、在app.js文件里。增加代码: 1)、引入模块:

javascript 复制代码
let multer  = require('multer');

2)、实例化并安装中间件

javascript 复制代码
//2 实例化  
let objMulter = multer({ dest: './public/upload' }); //dest: 指定 保存位置(存到服务器),这个根据实际情况可以修改。
​
//安装中间件, 
app.use(objMulter.any());  //允许上传什么类型文件,any 代表任何类型  

项目只有运行后,会自动在你的项目里,产生一个目录 public/upload,以后上传的文件都在此目录保存。

3)、写后端接口。

以我的项目为例。

3.1)、在routes下创建文件 uploadajax.js,写上如下代码:

javascript 复制代码
var express = require("express");
const fs = require("fs");
var router = express.Router();
​
router.post("/", function (req, res, next) {
  // multer对req对象做了扩展,增加了files属性,files属性里保存着上传文件的相关信息。
  // 如下:
  // fieldname:表单的name,其实就前端的参数名。 
    console.log("req.files[0].fieldname", req.files[0].fieldname);// photo
​
    const fileObj = req.files[0];
    let filename = (new Date()).getTime();//时间戳,毫秒数。
    let newPath = fileObj.destination+'/header'+filename+".jpg";
    //1、重命名文件
    fs.renameSync(fileObj.path,newPath);
    //2、给前端响应图片存储的路径。前端放在img标签的src属性上,就可以显示图片了。
    res.json({
        code:"200",
        path:`./upload`+'/header'+filename+".jpg"
    });
});
​
module.exports = router;

3.2)、在app.js里,引入 uploadajax.js,并写上接口的地址。

javascript 复制代码
var uploadajaxRouter = require("./routes/uploadajax");
​
​
..................
​
​
app.use("/uploadajax",uploadajaxRouter);
​
相关推荐
懒大王爱吃狼40 分钟前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
待磨的钝刨2 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
逐·風5 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫5 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦6 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子6 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山7 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享7 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
从兄8 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
清灵xmf9 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询