SpringCloud文件上传

2023-11-18

2.实现图片上传

刚才的新增实现中,我们并没有上传图片,接下来我们一起完成图片上传逻辑。

文件的上传并不只是在品牌管理中有需求,以后的其它服务也可能需要,因此我们创建一个独立的微服务,专门处理各种上传。

2.1.搭建项目

2.1.1.创建SpringCloud项目

2.1.2.添加依赖

我们需要EurekaClient和web依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>leyou</artifactId>
        <groupId>com.leyou.parent</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.leyou.service</groupId>
    <artifactId>ly-upload</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

2.1.3.编写配置

server:
  port: 8082
spring:
  application:
    name: upload-service
  servlet:
    multipart:
      max-file-size: 5MB # 限制文件上传的大小
# Eureka
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  instance:
    lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
    lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
    prefer-ip-address: true
    ip-address: 127.0.0.1
    instance-id: ${spring.application.name}:${server.port}

需要注意的是,我们应该添加了限制文件大小的配置

2.1.4.启动类

@SpringBootApplication
@EnableDiscoveryClient
public class LyUploadService {
    public static void main(String[] args) {
        SpringApplication.run(LyUploadService.class, args);
    }
}

结构:

在这里插入图片描述

2.2.编写上传功能

2.2.1.controller

编写controller需要知道4个内容:

  • 请求方式:上传肯定是POST
  • 请求路径:/upload/image
  • 请求参数:文件,参数名是file,SpringMVC会封装为一个接口:MultipleFile
  • 返回结果:上传成功后得到的文件的url路径

代码如下:

package com.leyou.upload.web;

import com.leyou.upload.service.UploadService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("upload")
public class UploadController {
    @Autowired
    private UploadService uploadService;
    /**
     * 上传图片功能
     * @param file
     * @return
     */
    @PostMapping("image")
    public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file){
        String url = uploadService.uploadImage(file);
        if(StringUtils.isBlank(url)){
            // url为空,证明上传失败
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        // 返回200,并且携带url路径
        return ResponseEntity.ok(url);
    }
}

2.2.2.service

在上传文件过程中,我们需要对上传的内容进行校验:

  1. 校验文件大小
  2. 校验文件的媒体类型
  3. 校验文件的内容

文件大小在Spring的配置文件中设置,因此已经会被校验,我们不用管。

具体代码:

package com.leyou.upload.service;

import com.leyou.common.enums.ExceptionEnum;
import com.leyou.common.exception.LyException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@Service
@Slf4j
public class UploadService {

    private static final List<String> ALLOW_TYPES = Arrays.asList("image/png", "image/jpeg", "image/bmg");

    public String uploadImage(MultipartFile file) {
        try {
            //校验文件类型
            String contentType = file.getContentType();
            if(!ALLOW_TYPES.contains(contentType)){
                throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
            }
            //校验文件的内容
            BufferedImage image = ImageIO.read(file.getInputStream());
            if(image == null){
                throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
            }
            //准备目标路径
            File dest = new File("E:\\黑马程序员57期\\09 微服务电商【黑马乐优商城】\\upload\\",file.getOriginalFilename());
            file.transferTo(dest);
            //返回路径
            return "http://image.leyou.com/"+file.getOriginalFilename();
        } catch (IOException e) {
            log.error("上传文件失败",e);
            throw new LyException(ExceptionEnum.UPLOAD_FILE_ERROR);
        }

    }
}

这里有一个问题:为什么图片地址需要使用另外的url?

  • 图片不能保存在服务器内部,这样会对服务器产生额外的加载负担
  • 一般静态资源都应该使用独立域名,这样访问静态资源时不会携带一些不必要的cookie,减小请求的数据量

2.2.3.测试上传

我们通过RestClient工具来测试:
在这里插入图片描述
结果:
1526197027688.png
去目录下查看:
1526197060729.png
上传成功!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud文件上传 的相关文章

  • Anchor-Free目标检测模型

    FCOS Fully Convolutional One Stage Object Detection 已开源 FoveaBox Beyond Anchor based Object Detector 未开源 FCOS 摘要 我们提出了一种
  • Android2023暑期实习---网易游戏一面面经

    Android2023暑期实习 网易游戏一面面经 2022 03 28 14 00 网易游戏一面 个人感觉网易游戏面试 题目有一定难度特别考验基础 自己基础不太行 加之开盘就慌了 肯定后面就是全局崩溃 主要是那些算法和操作系统 还有一些框架

随机推荐

  • Nginx配置-开启Http认证basic authentication

    Nginx配置 开启Http认证basic authentication txt 生成密码 将密放置于配置文件 修改nginx conf 重新加载nginx配置生效 认证测试 生成密码 可以使用htpasswd 或者使用openssl 比如
  • Android APP安装后在桌面上不显示应用图标

    前几天在写项目的时候运行的时候突然Android桌面上没有了应用图标 但是应用里面下载的应用有 调试版本和发布正式的版本都没有 之前以为是因为用了不同的keystore发布了两个不同的正式版本造成的问题 后来在看别人的文章才知道是什么问题
  • Win10中将WSL Ubuntu20.04设置普通用户为默认用户

    直接通过Microsoft Store安装的Ubuntu默认安装于C盘中 会占用一定空间 在导出wsl至本人电脑E盘后 每次登录都是root用户 参考网上教程使用 Ubuntu 20 04 config default user 用户名来更
  • prometheus通过node_exporter抓取的数据准确计算磁盘使用率

    公司使用的openstack的备份服务组件karbor 要查询所使用的备份nas磁盘使用率的需求 根据以前的查询语句 很快写出如下的prom sql 100 topk 1 node filesystem free device 100 no
  • SDRAM详解(结构框图、容量计算、寻址方式、初始化)

    1 SDRM介绍 SDRAM Syncronized Dynamic Ramdam Access Memory 是同步动态随机存储器 是DRAM的升级版 在SDRAM的基础上又发展出DDR double rate 即双倍速度的SDRAM D
  • vue-cli 工程中 访问插槽 数据

    具体解释参考文档 这个插槽啊 怎么说呢 如果你不开发组件 几乎很少用到 甚至用不到 访问插槽呢 使用方法vm slots 插槽名字 如果有的插槽没有名字 则使用vm slots default 访问 打印得到都是数组 得到dom 元素 vm
  • make_moons函数

    生成半环形数据 sklearn datasets make moons n samples 100 shuffle True noise None random state None 参数 n samples 整数型 可选 默认为100 产
  • Java中return、continue和break的区别

    之前一直对return continue break用法有混淆 今日特此学习 1 return 直接跳出当前的方法 返回到该调用的方法的语句处 继续执行 2 break 在循环体内结束整个循环过程 3 continue 结束本次的循环 直接
  • Flame Graphs 火焰图安装与使用

    一 火焰图概述 火焰图 flame graph 是性能分析的利器 通过它可以快速定位性能瓶颈点 perf 命令 performance 的缩写 是 Linux 系统原生提供的性能分析工具 会返回 CPU 正在执行的函数名以及调用栈 stac
  • 380. O(1) 时间插入、删除和获取随机元素

    实现RandomizedSet 类 RandomizedSet 初始化 RandomizedSet 对象 bool insert int val 当元素 val 不存在时 向集合中插入该项 并返回 true 否则 返回 false bool
  • [机缘参悟-74]:沟通技巧-无论在职场还是在家,尽量少用反问句

    目录 反问句的案例 尽量不要使用反问句 避免使用反问词 把反问句改为陈述句 反问句的案例 那天闲聊 邻居老贾向老友们诉苦 老伴今天又用反问句 款待 他了 中午炒菜时 老伴让他拿一瓶油来 老贾问 油瓶在哪里 你觉得油瓶会在哪里 老贾又问 是不
  • 解决k8s集群环境内存不足导致容器被kill问题

    背景 最近线上环境上出现了一个问题 k8s集群环境Pod中的tomcat容器运行一段时间后直接被killd 但有时一切看起来正常 不能准确判断在什么时机出现被Killd问题 本文就此问题介绍了Linux内存不足原因以及为什么特定进程会被杀死
  • nRF24L01单芯片2.4GHz收发模块射频信道频率

    框架图 管脚图 操作模式配置 射频信道频率 RF通道频率决定了 nRF24L01 使用的通道中心 该通道在 1Mbps 时占用 1MHz 带宽 在 2Mbps 时占用 2MHz 带宽 nRF24L01 可以在 2 400GHz 到 2 52
  • poll()函数详解

    poll提供的功能与select类似 不过在处理流设备时 它能够提供额外的信息 include
  • 测试流程简述

    测试流程 整体流程如下 需求评审 功能需求 性能需求 接口需求 测试计划 测试用例 用例评审 测试环境搭建 平台 架构 web服务器 数据库 执行用例 缺陷记录 缺陷跟踪和回归测试 测试报告 测试计划 测试计划 描述了要进行的测试活动的范围
  • 第八站:JavaScript的数据类型、运算符、流程控制语句

    第八站 JavaScript的数据类型 运算符 流程控制语句 欢迎来到第八站 JavaScript的数据类型 运算符 流程控制语句 在这一站 我们将深入探索JavaScript中的核心概念 为你揭示这个语言的奇妙之处 准备好继续冒险了吗 让
  • linux安装datax

    1 创建文件夹 存放安装包 cd opt mkdir datax cd datax 2 下载安装包 wget http datax opensource oss cn hangzhou aliyuncs com datax tar gz 3
  • 流程引擎是什么?有什么作用?

    编者按 本文详细论述了流程引擎的概念 流程引擎的作用以及选型的要旨 并介绍了自主研发具有中国特色的流程引擎 关键词 流程引擎 集成性 数据分析 BPMN2 0规范 中国特色 流程审批 自主研发 流程引擎是什么 流程引擎 用来驱动业务按照设定
  • Python基础语法(函数式编程)

    目录 实例1 温度转换 实例2 蟒蛇绘制 模块1 turtle库 基本图形绘制 基本数据类型 1 整数 浮点数 复数 1 整数 2 浮点数 3 复数 4 数值运算操作符 实例3 天天向上的力量 2 字符串 模块2 time库 时间的基本处理
  • SpringCloud文件上传

    2 实现图片上传 刚才的新增实现中 我们并没有上传图片 接下来我们一起完成图片上传逻辑 文件的上传并不只是在品牌管理中有需求 以后的其它服务也可能需要 因此我们创建一个独立的微服务 专门处理各种上传 2 1 搭建项目 2 1 1 创建Spr