IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> egg后端+Antd 上传图片到后端和读取图片在前端显示 -> 正文阅读

[JavaScript知识库]egg后端+Antd 上传图片到后端和读取图片在前端显示

在做项目过程中,常常会涉及保存图片的功能,以下是我使用egg.js+Antd完成的保存单张图片、从后端将图片传给前端的代码。

egg代码

项目思路:

  1. 将前端获得的图片存放在egg项目的某个文件夹中
  2. 将图片的地址存入数据库中
  3. 读取图片时,将数据库中的图片路径取出,转为base64格式传给前端
  4. 前端将base64转为图片显示

以下是我省去将图片路径写入数据库的步骤的代码。

在egg的控制器中某个js文件写入以下代码

//  app/controller/uploadImg.js
const Controller = require('egg').Controller;
//文件存储
const fs = require('fs');
const path = require('path');
const awaitWriteStream = require('await-stream-ready').write;
const imgBaseUrl = 'app/public/testUploadImg';//这是我的图片存放位置

class HomeController extends Controller {
    //  上传单张头像图片
    async uploadImg() {
        const ctx = this.ctx;
        //获取前端的文件流
        try {
            const stream = await ctx.getFileStream();
            // let uid=stream.fieldname;
            let time = Date.now();
            const filename = time + ".jpg";//文件名应该是有随机成分的且不能相同
            // 同步读取文件
            let files = fs.readdirSync(imgBaseUrl);//读取该文件夹
            let target = path.join(imgBaseUrl, filename);
            const writeStream = fs.createWriteStream(target);// 生成一个文件写入 文件流
            try {
                // 异步把文件流 写入
                await awaitWriteStream(stream.pipe(writeStream));
            } catch (err) {
                // 如果出现错误,关闭管道
                await sendToWormhole(stream);
                throw err;
            }
            //存图片路径到数据库中
            //我的图片路径是'app/public/testUploadImg'+filename;
            //在这里可以将图片的路径存入到自己对应的想要存入的表中
            //因为egg提供的数据库操作渠道较多,此处代码省略
            //===============================

            return ctx.body = {
                status: 1,
            };
        } catch (error) {
            console.log(error);
            ctx.body = {
                status: 0
            };
        }
    }

    //获取图片
    async getImg() {
        const ctx = this.ctx;
        try {
        //这里将文件夹下的所有图片都读出了,实际上应该是从数据库中得到图片路径
        //在从imgBaseUrl中获得相应的图片完整路径,使用fs.readFileSync("完整的图片路径", 'base64');将图片转为base64格式,
            let files = fs.readdirSync(imgBaseUrl);//读取该文件夹
            
            let imgArr = [];
            files.forEach((file) => {
            	//把每个图片都转为base64格式
                let base64 = fs.readFileSync(imgBaseUrl + '/' + file, 'base64');
                imgArr.push(base64);
            })
            return ctx.body = {
                status: 1,
                data: imgArr //将base64图片数组传给前端,到前端的时候再将base64转成图片显示
            }
        } catch (error) {
            console.log(error)
            return ctx.body = {
                status: 0,
            }
        }
    }
}

module.exports = HomeController;
// app/router.js
router.post('/uploadImg', controller.uploadImg.uploadImg);
router.post('/getImg', controller.uploadImg.getImg);

后端的代码以及接口的配置已经完成,接下来是我使用React框架,Antd的upload组件完成上传图片,以读出图片的前端代码。

import React from 'react';
import { useEffect, useState } from 'react';
import { getImg } from "../../../utils/apis/getImg";
import { Upload, message } from 'antd';

//页面代码
function Check() {

    const [imageUrl, setImgSrc] = useState([])

    const getData = async () => {
        const res = await getImg();
        if (res != 0) {
            let imgUrl = [];
            for (let item of res) {
                let imgSrc = "data:image/jpeg;base64," + item;//做base64的转化
                imgUrl.push(imgSrc);
            }
            setImgSrc(imgUrl);
        }
    }

    function beforeUpload(file) {
        const isJpgOrPng = file.type === 'image/jpeg';
        if (!isJpgOrPng) {
            message.error('仅支持jpg文件');
        }
        const isLt2M = file.size / 1024 / 1024 < 4;
        if (!isLt2M) {
            message.error('图片不能大于 4MB!');
        }
        return isJpgOrPng && isLt2M;
    }

    const handleChange = async info => {
        if (info.file.status === 'uploading') {
            return;
        }
        if (info.file.status === 'done') {
            console.log(info.file.response);
            if (info.file.response.status == 1) {
                await getData();
                message.info("上传成功");
            }
        }
    };

    useEffect(async () => {
        await getData();//一打开页面就会去请求后端的图片
    }, [])

    const uploadButton = (
        <div>
            <div style={{ marginTop: 8 }}>Upload</div>
        </div>
    );

    return (
        <div>
            <Upload
                name="avatar"
                listType="picture-card"
                className="avatar-uploader"
                showUploadList={false}
                action="http://127.0.0.1:7002/uploadImg"
                beforeUpload={beforeUpload}
                onChange={handleChange}
            >
                {uploadButton}
            </Upload>
            <div>
                {
                    imageUrl.map((item, index) => {
                        return (<span key={index}>
                            <img src={item} alt="avatar" style={{ width: '35%' }} />
                        </span>)
                    })
                }
            </div>
        </div>
    );
}
export default Check;

封装的axios:

//  src/utils/api.js
import axios from 'axios';
const $api = axios.create({
    baseURL: 'http://127.0.0.1:7002' //我的后端端口设置成7002,egg本身默认是7001,具体的端口根据自己的egg来写
}

二次封装的请求图片函数

// src/utils/apis/getImg.js![在这里插入图片描述](https://img-blog.csdnimg.cn/785d6e3f1e6948689d9f2324ad8aa372.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YWI6L-b546p5oSP,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

import $api from '../api';
export const getImg = async ({ ...params }) => {
    const res = await $api.post('/getImg', params);
    console.log(res.data)
    if (res.data.status == 1)
        return res.data.data;
    else return 0
}

到此为止代码就完成了。点击Upload选择图片上传,完成上传后页面重新向后端获取到图片,刷新页面
在这里插入图片描述
上传的图片被曝存在egg的项目中,如下:
在这里插入图片描述
这样一个单一的上传图片的功能就完成了。另外实际的项目中肯定是需要将图片的路径存入数据库中,此处没有给出,希望参考的小伙伴自己写的时候加上去吧~

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:02:06  更:2022-04-04 12:05:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:25:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码