没有文件服务器,头像存哪里合适

news2025/1/14 20:31:55

没有文件服务器,头像存哪里合适

1. 背景

之前有同学私信我说,他的项目只是想存个头像,没有别的文件存储需求,不想去用什么Fastdfs之类的方案搭建文件服务器,有没有更简单且无需后期维护的方案,我喝了一口过期的开水,想了下,还真有,现在就给大家介绍一下。

这个方案就是把头像存在表里,但是要切记,不要存大图,否则会严重影响数据库性能,怎么确保这一点呢,其实只要对上传的图片转成缩略图就可以保证存进去的是小图,这样的话这个方案就比较完美了。

2. 关键步骤梳理

2.1 数据库设计

字段的类型应该是blob, blob是一种二进制存储类型,用来存储图片完全是没问题的

在这里插入图片描述

2.2 后端接口

  1. Controller

    @Operation(summary = "修改头像")
    @PostMapping("/avatar")
    public Result<?> updateAvatar(MultipartFile file, @RequestParam("userId") Integer userId) throws IOException, SQLException {
    
        // 读取上传的原始图片
        BufferedImage originalImage = ImageIO.read(file.getInputStream());
    
        // 创建缩略图
        int thumbnailSize = 200;
    
        // 计算缩略图的宽度和高度,保持原宽高比例
        int newWidth, newHeight;
        if (originalImage.getWidth() > originalImage.getHeight()) {
            newWidth = thumbnailSize;
            newHeight = thumbnailSize * originalImage.getHeight() / originalImage.getWidth();
        } else {
            newWidth = thumbnailSize * originalImage.getWidth() / originalImage.getHeight();
            newHeight = thumbnailSize;
        }
    
        // 创建缩略图
        BufferedImage thumbnail = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics2D = thumbnail.createGraphics();
        graphics2D.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
        graphics2D.dispose();
    
        // 裁剪成以图片中心为中心的正方形,因为前端是以正方形显示
        int x = 0;
        int y = 0;
        int cropSize = Math.min(newWidth, newHeight);
        if (newWidth > newHeight) {
            x = (newWidth - cropSize) / 2;
        } else {
            y = (newHeight - cropSize) / 2;
        }
        thumbnail = thumbnail.getSubimage(x, y, cropSize, cropSize);
    
    
    
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        ImageIO.write(thumbnail, "jpg", bs);
        byte[] thumbnailBytes = bs.toByteArray();
    
        userService.updateAvatar(userId,thumbnailBytes);
        return Result.success();
    }
    
    
    
    @Operation(summary = "查询头像")
    @GetMapping("/avatar")
    public Result<?> getAvatar(@RequestParam("userId") Integer userId){
        byte[] arvatarData =  userService.getAvatar(userId);
        return Result.success(arvatarData);
    }
    
  2. Service

    @Override
    public void updateAvatar(Integer userId, byte[] avatar) throws SQLException {
        log.debug("avatar: " + avatar.length);
        SerialBlob avatarBlob = new SerialBlob(avatar);
        userMapper.updateAvatar(userId,avatarBlob);
    }
    
    @Override
    public byte[] getAvatar(Integer userId) {
        User user = userMapper.selectById(userId);
        return user.getAvatarData();
    }
    
  3. Mapper

    @Update("update wj_user set avatar_data=#{avatarBlob} where id = #{userId}")
    void updateAvatar(Integer userId, Blob avatarBlob);
    

3 前端关键代码

在这里插入图片描述

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

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

相关文章

MP2110A Anritsu 安立 采样示波器 眼图设备 简述

MP2110A是一款集成了误码率测试仪&#xff08;BERT&#xff09;和采样示波器的一体化测量仪器&#xff0c;主要用于光学模块的误码率&#xff08;BER&#xff09;测量、眼图分析等评估操作。它支持从10G到800G的光学模块制造过程中的检测分91522。MP2110A内置4通道采样示波器&a…

【InternLM实战营---第七节课笔记】

一、本期课程内容概述 本节课的主讲老师是【曹茂松、刘卓鑫】。教学内容主要包括以下三个部分&#xff1a; 1.大模型评测的背景 2.大模型评测工具OpenCompass的介绍 3.OpenCompass实战 二、学习收获 为什么要研究大模型的评测&#xff1f; 首先&#xff0c;研究评测对于我们全…

Spring Boot框架强大的事件驱动模型(ApplicationEvent)

文章目录 前言应用场景异步处理事务边界外的操作跨微服务通信系统监控与日志聚合UI更新生命周期管理工作流或业务流程缓存同步 小试牛刀定义事件实现事件处理器注册事件处理器发布事件测试事件 写在最后 前言 在Spring Boot应用中&#xff0c;事件处理器是指那些处理特定类型事…

SCP收容物121~130

注 &#xff1a;此文接SCP简介以及116~120的介绍,本文只供开玩笑 ,与steve_gqq_MC合作。 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-121 scp-122 scp-123 scp-124 …

webpack面试题(持续汇总ing。。。)

webpack的编译过程 初始化 此阶段&#xff0c;webpack会将CLI参数、配置文件、默认配置进行融合&#xff0c;形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备目前&#xff0c;…

IDEA左右两侧的Project,Structure,Maven等按钮消失

目录 问题描述解决方法 问题描述 学习的时候 左右两侧没有这些按钮感觉切换很不方便 之前每次加载MAVEN都要在View里手动把他点出来 解决方法 选择File-Settings

文化旅游3D数字孪生可视化管理平台推动文旅产业迈向更加美好的未来

随着数字化、智能化管理成为文旅产业发展的必然趋势&#xff0c;数字孪生公司深圳华锐视点创新性地推出了景区三维可视化数字孪生平台&#xff0c;将线下的实体景区与线上的虚拟世界完美融合&#xff0c;引领智慧文旅新潮流。 我们运用先进的数字孪生、web3D开发和三维可视化等…

树莓派学习笔记--Wiring Pi库的安装

前言 在刚开始学习树莓派的时候&#xff0c;新版本操作系统与旧版本有一定的区别&#xff0c;就导致跟着网上的教程来出现了很多问题&#xff0c;然后网上新操作系统的教程又很少&#xff0c;就导致前些时间学习一直没有进展。最近终于是把这些问题解决了。所以记录下来这些东西…

怎么办xgp会员一年多少钱xgp会员怎么开轻松教你xgp会员开通教程

怎么办&#xff1f;xgp会员一年多少钱&#xff1f;xgp会员怎么开&#xff1f;轻松教你xgp会员开通教程 XGP平台是由微软公司开发的xbox游戏平台的pc版本&#xff0c;为电脑玩家提供了一个游玩微软游戏的平台&#xff0c;XGP平台因其独特的会员服务而广受玩家们好评&#xff0…

windows本地提权--dll劫持不带引号的服务不安全的服务

免责声明:本文仅做技术交流与学习... 目录 一.dll劫持 过程: 火绒剑检测: ChkDllHijack检测: 检测出来有--->msf生成dll后门 二.不带引号服务 路径 1-找不带引号的服务 2-改名上传 3-监听后-->等待服务重启 4-getuid拿下 三.不安全的服务权限配合MSF accessc…

常见的网站

1.小林coding图解计算机网络、操作系统、计算机组成、数据库&#xff0c;让天下没有难懂的八股文&#xff01;https://xiaolincoding.com/ 2.

三数之和 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将所有的三元组都算出来看是否为0, 题目要求去重操作, 所以我们可以使用set去重解法二: 因为我们知道当计算两数之和时, 我们使用的方法是将数组排序,然后利用"双指针"那么同理, 计算三个数之和: 1. 排序2. 固定一个数a, …

语义分割——PartNet大规模三维对象数据集

PartNet&#xff1a;一个大规模、细粒度、实例级和分层注释的三维对象数据集 介绍 随着计算机视觉和三维数据处理技术的飞速发展&#xff0c;对大规模、高质量的三维对象数据集的需求日益增长。在这样的背景下&#xff0c;PartNet应运而生&#xff0c;它是一个具有开创性的三维…

【论文笔记 | 异步联邦】 FedBuff

1. 论文信息 Federated Learning with Buffered Asynchronous Aggregation&#xff0c;International Conference on Artificial Intelligence and Statistics&#xff0c;2022&#xff0c;ccfc 2. introduction 2.1.1. 背景&#xff1a; 同步 FL &#xff0c;随训练过程中…

深耕“星光电务”党建品牌 引领保障企业高质量发展

在日前闭幕的2024年首届全国企业党务工作者论坛中&#xff0c;中铁十一局集团电务工程有限公司提交的论文《深耕“星光电务”党建品牌 引领保障企业高质量发展》荣获优秀论文奖。该论文由陈柯、刘敏之、徐干、姜亦珂联合撰写&#xff0c;展示了他们在党建工作中的创新实践与显著…

X.509数字证书的签名和指纹

X.509 是一种非常普遍的数字证书标准,由国际电信联盟(ITU)制定。它定义了证书的格式和一种验证证书有效性的方法。X.509 证书的结构遵循特定的语法和编码规则,通常使用 ASN.1 (Abstract Syntax Notation One) 进行描述和编码。 一个典型的X.509证书通常包含:版本、序列号、…

SignalR中的重连机制和心跳监测机制详解

一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…

汽车Type-C接口:特点与要求解析

汽车Type-C接口的需求增长 随着汽车科技的不断发展&#xff0c;车载电子设备的功能和数量不断增加&#xff0c;因此&#xff0c;对于汽车Type-C接口的需求也在逐渐增长。作为一种高速、多功能的连接标准&#xff0c;汽车Type-C接口在车载设备连接中扮演着越来越重要的角色。 …

45. 【Android教程】内容提供者 - Content Provider

本节学习最后一个 Android 组件——内容提供者。顾名思义&#xff0c;它可以用来给其他的 App 提供各种内容&#xff0c;比如 Android 自带的短信、联系人、日历等等都是一个普通的 App&#xff0c;当你需要这些内容的时候&#xff0c;就可以向它们的 Content Provider 发起请求…

Siddhi 快速入门-安装Siddhi 编辑器

第一次使用Siddhi 在本节中&#xff0c;我们将使用 Siddhi 工具发行版 — Siddhi 的服务器版本&#xff0c;具有带有 GUI 的复杂的基于 Web 的编辑器&#xff08;称为“Siddhi 编辑器”&#xff09;&#xff0c;您可以在其中编写 Siddhi 应用程序并模拟事件来测试您的场景。 …