前后端图片交互的简易方式

news2024/10/7 12:19:30

前后端图片交互的简易方式

  • 一、交互方式说明
  • 二、前后端具体代码实现
    • 前端具体代码实现
    • 后端具体代码
    • 实现效果

测试结果

请添加图片描述

一、交互方式说明

在项目的实际开发中,难免会遇到前端需要渲染数据库中保存的图片,那咱知道图片也属于一种文件,不好保存到数据库,那怎么处理比较好呢?

这边小编采用的方式是将图片链接保存到数据库中,而实际图片保存在具体目录中。前端当使用el-image标签去渲染图片的时候,也相当于发一次Get方式的请求,这个时候后端再把具体目录的图片给它(以二进制的形式给它,然后el-image收到后会转成图片)。

测试技术栈说明
前端:vue3 + Element-plus
后端:SpringBoot

二、前后端具体代码实现

前端具体代码实现

下面是前端完成图片上传的ImageUpload组件代码。

<template>
    <el-upload
            :action="picAction"
            :limit="10"
            list-type="picture-card"
            accept=".png, .jpg"
            :on-success="sucessUpload"
            :on-error="errorUpload"
            :before-upload="beforeUpload"
    >
        <el-button size="small" type="primary"> 点击上传 </el-button>
    </el-upload>
    <el-image :src="imageAction" v-show="flag"/>
</template>

<script setup>
import {ElMessage, ElNotification} from "element-plus"
import {onBeforeUpdate, ref} from 'vue'
import Image from './Image.vue'

const picAction = ref('')// 这个可以说的保存图片发的请求,也可以去当作图片获取的请求
// 也就是说这个可以存到对应的数据库中
const imageAction = ref('')
const flag = ref(false)


function sucessUpload(){
    ElNotification({
        message: '图片上传成功',
        type: 'success',
        duration: 1500
    })
    console.log('success')
    flag.value=true
    imageAction.value = `http://localhost:8080/images?path=/test/${fileName}`
}

function errorUpload(){
    ElNotification({
        message: "图片上传失败",
        type: 'error',
        duration: 1500
    })
    console.log('error')
}
let fileName = ''
function beforeUpload(file){
    fileName = file.name
    picAction.value = `http://localhost:8080/images/test/${fileName}`
}

onBeforeUpdate(()=>{
    console.log(imageAction.value)
    console.log(666)
})

</script>

上面代码注意个细节:imageAction需要成功上传后再更改其值然后响应式,不然服务器端是没有的,一直会报文件无法找到异常。

在APP组件中使用这个ImageUpload组件做测试。在main.js文件中需要添加Element-plus一些东西,比如element-plus/dist/index.css(可以不加它,但是会好丑)。
下面是main.js代码

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App).use(ElementPlus)

app.mount('#app')

前端需要注意的点

  • 文件上传发送的请求方式是POST;
  • 可以用 before-upload 去设置一个上传前的回调函数,回调函数可以为其传递file参数,在这里可以进行事件的触发、向后端发送文件上传请求路径的设定等等操作。
  • el-upload 这个标签是用来上传文件的,图片是属于文件范畴的,所以是可以不局限于图片的,可灵活使用。

后端具体代码

后端代码内容大概分为以下俩步

  1. 设置允许跨域,设置允许某源进行访问;
  2. 具体的保存图片和获取图片的表示层实现。
  • 允许跨域代码(前端的端口号小编设置的是8081)
@Configuration
public class WebMvcOriginConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:8081/")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true);
    }

}
  • 配置请求资源映射(这步看你图片资源的位置,如果你的图片资源放在项目的根目录和src平级就不用配,如果你是放在项目之外或者说resources资源路径下,你需要配置这个资源映射)。
@Configuration
public class WebMvcImageConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:images/");
    }
}
  • 具体存储图片和获取图片代码实现
@RestController
@RequestMapping("/images")
public class ImageController {


    @GetMapping
    public void getImage(@RequestParam("path") String path,
                         HttpServletResponse response) throws IOException {
        response.setContentType("image/png,image/jpeg");// 设置MIME类型,也就是响应类型
        ServletOutputStream out = response.getOutputStream();
        File file = new File("images" + path);
        InputStream in = new FileInputStream(file);
        int available = in.available();
        byte[] bytes = new byte[available];
        in.read(bytes);
        out.write(bytes);
        in.close();
        out.close();
    }

    @PostMapping("/{dirName}/{fileName}")
    public void setImage(MultipartFile file,
                         @PathVariable String dirName,
                         @PathVariable String fileName) throws IOException {

        File file1 = new File("images/" + dirName + "/" + fileName);
        OutputStream out = new FileOutputStream(file1);
        // 获取图片的输入流
        InputStream in = file.getInputStream();
        byte[] bytes = new byte[1024*100];//100kb
        int cnt = 0;
        // 开始存图片
        while((cnt=in.read(bytes))!=-1){
            out.write(bytes,0,cnt);
        }
        in.close();
        out.close();
    }
}

注意点

  1. 请求资源映射是根据图片的存放位置判断是否需要的(也就是上面的第二步),如果不配置这个的话,如果是存储在resources目录下,存储后是需要重启服务器才能访问到资源的。这是由于存储后的资源没有重新加载到服务器可访问到的地方。如果直接更改请求映射的资源路径,让一些请求的资源路径直接变化到磁盘上(绝对路径)。这样磁盘上的资源变化了,那路径可访问的资源也就变化了
  2. 需要使用SpringBoot提供的MultipartFile的接口,它可以用来处理文件上传,可以得到文件上传过程中的数据,可以得到其文件的输入流。(这里需要注意的是:MultipartFile不是Springboot的默认数据类型(不是像HttpServletRequest这样的),它是通过@RequestParam(“file”)注解引入的。小编上面的参数名是file,boot会给咱自动调@RequestParam(“file”)传参)
  3. 在使用response对象返回图片给前端时,需要设置响应类型(MIME类型)。

实现效果

首先说明一下这里本是没有图片文件的。
在这里插入图片描述
测试效果

请添加图片描述

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

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

相关文章

maven依赖jar包时版本冲突的解决

1、第一声明优先原则 在pom.xml配置文件中&#xff0c;如果有两个名称相同版本不同的依赖声明&#xff0c;那么先写的会生效。 所以&#xff0c;先声明自己要用的版本的jar包即可。 所以&#xff0c;添加新依赖时要放在最后边&#xff0c;以防止新依赖替换原有依赖造成版本冲…

Mybatis基础操作XML映射文件

Mybatis基本操作 一、环境准备 数据库表和springboot工程在课程资料中都有提供 注意&#xff0c;entrydate是用的jdk1.8中的LocalDate类型&#xff0c;createTime用的是jdk1.8中的LocalDateTime类型 二、删除 Mybatis中提供了一种参数占位符 #{id} empMapper.java package…

Leetcode461. 汉明距离

Every day a leetcode 题目来源&#xff1a;461. 汉明距离 解法1&#xff1a;模拟 先将x和y转为为对应二进制的字符串&#xff0c;再遍历两个字符串进行比较。 代码&#xff1a; /** lc appleetcode.cn id461 langcpp** [461] 汉明距离*/// lc codestart class Solution {…

HTML的两个实战项目

文章目录 HTML的两个实战项目1. 个人简历1. 1 快速生成模板1.2 根据简历格式进行预设计1.3 开始创作吧1.3.1 基本信息1.3.2 教育背景1.3.3 专业技能1.3.4 我的项目1.3.5 自我评价 2. 输入简历信息页面设计2.1 设计大概框架2.2 开始创作吧2.2.1 输入姓名2.2.2 上传照片2.2.3 输入…

Axure教程——用中继器制作动态柱状图

今天作者就教大家在Axure里面如何用中继器做一个可以动态的柱状图。 制作完成之应具备以下交互效果&#xff1a; 1.在中继器表格中填写具体数据和坐标轴后&#xff0c;自动生成对应的柱状图 2.鼠标移动到每项&#xff0c;显示其数据 预览地址&#xff1a;https://tj4v11.axshar…

node笔记_读文件(异步读取、流式读取)

文章目录 ⭐前言⭐ 读取文件异步读 readFile读取txt 流式读 createReadStream读取视频 ⭐ 结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本期分享node读取文件。 往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_http服务…

2023/05/02~07 刷题记录

A - AABCC 题义&#xff1a; 题解&#xff1a; 读完题目可以想到直接暴力&#xff0c;但是肯定超时别想了。 因为 a b c 都是素数&#xff0c;所以我们可以先求出所有的素数 进行减少循环的次数&#xff0c;然后遍历。在遍历过程中&#xff0c;我们也要去进行剪枝 &#xff0c;…

10_Uboot启动流程_2

目录 _main函数详解 board_init_f函数详解 relocate_code函数详解 relocate_vectors函数详解 board_init_r 函数详解 _main函数详解 在上一章得知会执行_main函数_main函数定义在文件arch/arm/lib/crt0.S 中,函数内容如下: 第76行,设置sp指针为CONFIG_SYS_INIT_SP_ADDR,也…

美团外卖红包优惠券:美团外卖节红包或美团外卖天天神券怎么领取使用?

什么是美团外卖节红包或美团外卖天天神券&#xff1f; 美团外卖节红包、美团外卖天天神券都可以称为美团外卖红包优惠券。使用美团外卖节红包、美团外卖天天神券&#xff0c;点餐可以享受优惠。且美团外卖节红包、美团外卖天天神券每天都可以免费领取。美团会员红包不能与美团…

nginx相关知识

目录 一. Nginx目录结构 二. Nginx配置文件结构 三. Nginx具体应用 1. 部署静态资源 2. 反向代理 3. 负载均衡 一. Nginx目录结构 重点目录/文件&#xff1a; conf/nginx.conf nginx配置文件html 存放静态文件&#xff08;html、CSS、Js等&#xff09;logs 日志目…

【Redis】数据结构底层结构

我们知道Redis的很快&#xff0c;一个原因是因为在内存上操作&#xff0c;另一个原因是本身的数据结构。而具体的五大类型就是如下&#xff1a; 键和值如何组织的 通过key找到value的过程&#xff0c;Redis使用了哈希表结构进行查找。具体就是根据key的hash值计算出对应的下…

三子棋(C语言重做版)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

对标ChatGPT3.5,支持手机电脑网页使用,无需魔法

说到 Claude 是什么&#xff0c;大家可能没听说过。 但是说到 OpenAI&#xff0c;说到 ChatGPT&#xff0c;相信大家一定听说过&#xff0c;玩过。 PS&#xff1a;关于 Claude 网页版的注册教程&#xff0c;我之前已经写过文章了&#xff0c;现在额外介绍如何使用手机App和电脑…

centos搭建code-server及配置HTTPS、登录页自定义

文章目录 一、Code-Server二、安装及运行三、系统配置四、HTTPS配置五、登录页面自定义 注&#xff1a;本版本基于4.11.0&#xff0c;在此之前版本&#xff0c;在centos上会出现CPU占用一直100%的情况&#xff0c;当前版本已经搭建两个月&#xff0c;综合下来比较稳定 通过搭建…

【高数+复变函数】傅里叶级数

文章目录 1. 傅里叶级数1.1 和差化积积化和差1.2 三角函数系的正交性1.3 系数公式求解1.4 展开条件1.5 变形下的傅里叶 在课程学习中&#xff0c;感觉这一部分的东西频繁会被用到&#xff0c;因此写下来做个总结。 1. 傅里叶级数 在科学技术中&#xff0c;常常会遇到各种各样的…

【matplotlib】4-完善统计图形

文章目录 完善统计图形1 添加图例和标题1.1 图例和标题的设置方法1.2 案例1--图例的展示样式的调整1.3 案例2--标题的展示样式的调整1.4 案例3--带图例的饼图 2 调整刻度范围和刻度标签2.1 调整刻度范围和刻度标签的方法2.2 子区函数--subplot()2.3 案例--逆序设置坐标轴刻度标…

密码学:公钥密码.(非对称密码)

密码学&#xff1a;公钥密码. 公钥密码 (Public Key Cryptography)&#xff0c;又称为非对称密码&#xff0c;其最大特征是加密和解密不再使用相同的密钥&#xff0c;而使用不同的密钥。使用者会将一个密钥公开&#xff0c;而将另一个密钥私人持有&#xff0c;这时这两个密钥被…

【WebGIS初学到入职】第二阶段的小结

一、前言 2021年12月&#xff0c;我进行了【WebGIS初学到入职】第一阶段的小结&#xff0c;如今&#xff0c;一年半过去了。我完成了毕业设计&#xff0c;平缓得通过了岗位的试用期&#xff0c;而且作为我所在部门唯一的前端开发&#xff0c;参与了越来越多的工作项目。 同时…

源码分析RocketMQ之NameServer

整体架构图 从部署架构图可知NameServer与所有的broker通讯&#xff0c;NameServer集群之间互不通信。 主要功能包括 1、Broker管理 1.1 维护Broker集群 clusterAddrTable 1.2 Broker信息 接收Broker注册信息并保存作为路由信息的基本数据 brokerAddrTable 1.3 Topic消息路由…

【软件质量保证与测试】实验二之ACTS工具

索引 0. 前言1. ACTS 获取2. ACTS 启动2.1 双击启动GUI2.2 终端启动GUI2.3 进入GUI 3. ACTS 参数类型3.1 新建系统3.2 ACTS 添加成员3.2.1 Boolean类型3.2.2 Enum类型3.2.3 Number类型3.2.4 Range类型3.2.5 其他 4. ACTS 约束5. 混合组合强度6. 参考模型6.1 设定模型6.2 参数设…