第2-3-4章 上传附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

news2024/11/18 7:28:41

文章目录

      • 5.3 接口开发-上传附件
        • 5.3.1 接口文档
        • 5.3.2 代码实现
        • 5.3.3 接口测试

5.3 接口开发-上传附件

第2-1-2章 传统方式安装FastDFS-附FastDFS常用命令
第2-1-3章 docker-compose安装FastDFS,实现文件存储服务
第2-1-5章 docker安装MinIO实现文件存储服务-springboot整合minio-minio全网最全的资料

全套代码及资料全部完整提供,点此处下载

5.3.1 接口文档

上传附件接口要完成的操作主要有两个:

  • 将客户端提交的文件上传到指定存储位置(具体存储位置由配置文件配置的存储策略确定)
  • 将上传的文件信息保存到数据库的pd_attachment表中

接口文档如下:
在这里插入图片描述
在这里插入图片描述

5.3.2 代码实现

第一步:创建AttachmentController并提供文件上传方法

package com.itheima.pinda.file.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.pinda.base.BaseController;
import com.itheima.pinda.base.R;
import com.itheima.pinda.file.dto.AttachmentDTO;
import com.itheima.pinda.file.dto.AttachmentRemoveDTO;
import com.itheima.pinda.file.dto.AttachmentResultDTO;
import com.itheima.pinda.file.dto.FilePageReqDTO;
import com.itheima.pinda.file.entity.Attachment;
import com.itheima.pinda.file.service.AttachmentService;
import com.itheima.pinda.utils.BizAssert;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import static com.itheima.pinda.exception.code.ExceptionCode.BASE_VALID_PARAM;
import static java.util.stream.Collectors.groupingBy;
/**
 * 附件处理控制器
 */
@RestController
@RequestMapping("/attachment")
@Slf4j
@Api(value = "附件", tags = "附件")
public class AttachmentController extends BaseController {
    @Autowired
    private AttachmentService attachmentService;

    /**
     * 上传附件
     */
    @ApiOperation(value = "附件上传", notes = "附件上传")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "isSingle", value = "是否单文件", dataType = "boolean", paramType = "query"),
            @ApiImplicitParam(name = "id", value = "文件id", dataType = "long", paramType = "query"),
            @ApiImplicitParam(name = "bizId", value = "业务id", dataType = "long", paramType = "query"),
            @ApiImplicitParam(name = "bizType", value = "业务类型", dataType = "long", paramType = "query"),
            @ApiImplicitParam(name = "file", value = "附件", dataType = "MultipartFile", allowMultiple = true, required = true),
    })
    @PostMapping(value = "/upload")
    public R<AttachmentDTO> upload(
            @RequestParam(value = "file") MultipartFile file,
            @RequestParam(value = "isSingle", required = false, defaultValue = "false") Boolean isSingle,
            @RequestParam(value = "id", required = false) Long id,
            @RequestParam(value = "bizId", required = false) String bizId,
            @RequestParam(value = "bizType") String bizType) {
        
        // 忽略路径字段,只处理文件类型
        if (file.isEmpty()) {
            return fail(BASE_VALID_PARAM.build("请求中必须至少包含一个有效文件"));
        }
        AttachmentDTO attachment = attachmentService.upload(file, 
                                                            id, 
                                                            bizType, 
                                                            bizId, 
                                                            isSingle);

        return success(attachment);
    }
}

第二步:创建AttachmentService接口

package com.itheima.pinda.file.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.itheima.pinda.file.dto.AttachmentDTO;
import com.itheima.pinda.file.dto.AttachmentResultDTO;
import com.itheima.pinda.file.dto.FilePageReqDTO;
import com.itheima.pinda.file.entity.Attachment;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 附件业务接口
 */
public interface AttachmentService extends IService<Attachment> {
    /**
     * 上传附件
     *
     * @param file 文件
     * @param id 附件id
     * @param bizType 业务类型
     * @param bizId 业务id
     * @param isSingle 是否单个文件
     * @return
     */
    AttachmentDTO upload(MultipartFile file, Long id, String bizType, 
                         String bizId, Boolean isSingle);

}

第三步:创建AttachmentServiceImpl实现类

package com.itheima.pinda.file.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.pinda.base.id.IdGenerate;
import com.itheima.pinda.database.mybatis.conditions.Wraps;
import com.itheima.pinda.database.mybatis.conditions.query.LbqWrapper;
import com.itheima.pinda.dozer.DozerUtils;
import com.itheima.pinda.exception.BizException;
import com.itheima.pinda.file.dao.AttachmentMapper;
import com.itheima.pinda.file.domain.FileDO;
import com.itheima.pinda.file.domain.FileDeleteDO;
import com.itheima.pinda.file.dto.AttachmentDTO;
import com.itheima.pinda.file.dto.AttachmentResultDTO;
import com.itheima.pinda.file.dto.FilePageReqDTO;
import com.itheima.pinda.file.entity.Attachment;
import com.itheima.pinda.file.entity.File;
import com.itheima.pinda.file.enumeration.DataType;
import com.itheima.pinda.file.properties.FileServerProperties;
import com.itheima.pinda.file.service.AttachmentService;
import com.itheima.pinda.file.strategy.FileStrategy;
import com.itheima.pinda.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 附件业务实现类
 */
@Slf4j
@Service
public class AttachmentServiceImpl extends ServiceImpl<AttachmentMapper, Attachment> implements AttachmentService {
    @Autowired
    private IdGenerate<Long> idGenerate;
    @Autowired
    private DozerUtils dozer;
    @Autowired
    private FileStrategy fileStrategy;
    @Autowired
    private FileServerProperties fileProperties;

    /**
     * 上传附件
     *
     * @param multipartFile 文件
     * @param id 附件id
     * @param bizType 业务类型
     * @param bizId 业务id
     * @param isSingle 是否单个文件
     * @return
     */
    @Override
    public AttachmentDTO upload(MultipartFile multipartFile, Long id, String bizType, String bizId, Boolean isSingle) {
        //根据业务类型来判断是否生成业务id
        if (StringUtils.isNotEmpty(bizType) && StringUtils.isEmpty(bizId)) {
            bizId = String.valueOf(idGenerate.generate());
        }
        File file = fileStrategy.upload(multipartFile);

        Attachment attachment = dozer.map(file, Attachment.class);

        attachment.setBizId(bizId);
        attachment.setBizType(bizType);
        setDate(attachment);

        if (isSingle) {
            super.remove(Wraps.<Attachment>lbQ().eq(Attachment::getBizId, bizId).eq(Attachment::getBizType, bizType));
        }

        if (id != null && id > 0) {
            //当前端传递了文件id时,修改这条记录
            attachment.setId(id);
            super.updateById(attachment);
        } else {
            attachment.setId(idGenerate.generate());
            super.save(attachment);
        }

        AttachmentDTO dto = dozer.map(attachment, AttachmentDTO.class);
        return dto;
    }

    private void setDate(Attachment file) {
        LocalDateTime now = LocalDateTime.now();
        file.setCreateMonth(DateUtils.formatAsYearMonthEn(now));
        file.setCreateWeek(DateUtils.formatAsYearWeekEn(now));
        file.setCreateDay(DateUtils.formatAsDateEn(now));
    }
}

5.3.3 接口测试

第一步:启动Nacos配置中心,pd-file-server.yml配置内容如下:

pinda:
  mysql:
    database: pd_files
  nginx:
    ip: ${spring.cloud.client.ip-address} #正式环境要将该ip设置成nginx对应的公网ip
    port: 10000  #正式环境需要将该ip设置成nginx对应的公网端口
  swagger:
    enabled: true
    docket:
      file:
        title: 文件服务
        base-package: com.itheima.pinda.file.controller

  file:
    type: LOCAL # LOCAL ALI MINIO FAST_DFS  
    local:
      uriPrefix: http://${pinda.nginx.ip}:${pinda.nginx.port}
      bucket-name: oss-file-service
      endpoint: D:\soft\nginx-1.23.0\uploadFiles
    ali:
      # 请填写自己的阿里云存储配置
      bucket-name: bladex-loan
      endpoint: http://oss-cn-qingdao.aliyuncs.com
      access-key-id: LTAI4FhtimFAiz6iLGJSiJui  
      access-key-secret: SsU15qaPwpF1x5xMqwc0XzGuY92fnc

#FAST_DFS配置
fdfs:
  soTimeout: 1500
  connectTimeout: 600
  thumb-image:
    width: 150
    height: 150
  tracker-list:
    - 111.231.76.210:22122
  pool:
    #从池中借出的对象的最大数目
    max-total: 153
    max-wait-millis: 102
    jmx-name-base: 1
    jmx-name-prefix: 1


server:
  port: 8765

第二步:启动Nginx服务

第三步:启动文件服务

第四步:访问接口文档,地址为http://localhost:8765/doc.html

在这里插入图片描述

可以看到上传的文件已经保存到了本地磁盘:
在这里插入图片描述
同时上传的文件信息也已经保存到了pd_attachment表中:
在这里插入图片描述

可以通过Nginx提供的Http服务来访问上传的文件:

http://192.168.137.3:10000//oss-file-service/2022/11/e76d3505-df38-4f95-a7bd-fb5de3ebe923.txt

全套代码及资料全部完整提供,点此处下载

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

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

相关文章

MindMaster思维导图及亿图图示会员 超值获取途径

MindMaster思维导图及亿图图示会员 超值获取途径 会员九折优惠方法分享给大家&#xff01;如果有需要&#xff0c;可以上~ 以下是食用方法&#xff1a; MindMaster 截图 亿图图示 截图 如果需要MindMaster思维导图或者亿图图示会员&#xff0c;可按照如下操作领取超值折扣优惠…

SaaS系统平台赋能大健康产业互联网变革,助力企业提升市场占有率

当前&#xff0c;数字化浪潮正在重塑大健康产业。随着全国多个重要省市的数字医疗、数字医保等措施正火热展开&#xff0c;我国大健康产业的数字化转型进程正在提速&#xff0c;这也为新一轮的行业洗牌带来新的发展机遇。 大健康产业数字化转型痛点&#xff1a;传统医疗信息化…

消息队列之kafka

1.先部署zookeeper集群 2.了解zookeeper 分布式服务系统框架&#xff1a;存储业务服务节点的元数据及状态信息并 负责通知zookeeper上注册服务节点给客户端 一、Zookeeper 概述 官方下载地址&#xff1a;archive.apache.org/dist/zookee… 1.1 Zookeeper 定义 Zookeeper…

使用KNN进行手写体识别和iris数据集分类

文章目录手写体识别iris数据集分类手写体识别 首先使用load_digits将数据加载&#xff0c;这里的数据集有1797个样本&#xff0c;前1384个训练数据而后面的413个样本作为测试集&#xff0c;每个数据集中的样本是8*8像素的图像和一个[0, 9]整数的标签。紧接着输出64个样本的图像…

【Egg从基础到进阶】二:安装本地Mysql

什么是数据库&#xff1a; 数据库是用于将数据持久化存储的一个容器&#xff0c;并且在这个容器处于云端&#xff0c;而不是像游览器的本地存储一样&#xff0c;数据只是针对你当前所在游览器。游览器的存储是一对一的。而线上数据库的存储是一对多的&#xff0c;或者是多对多的…

被欧美公司垄断近 20 年,中国工业软件的机会在哪里?

【CSDN 编者按】工业软件&#xff0c;又被称之为是现代工业体系的“大脑”。近年来&#xff0c;在政府、企业、从业者等各方的齐心协力之下&#xff0c;中国工业软件市场规模不断壮大&#xff0c;逐渐成为“制造大国”。然而&#xff0c;站在全球的角度来看&#xff0c;相较一些…

使用小程序制作一个飞机大战小游戏

此文主要基于微信小程序制作一个飞机大战小游戏&#xff0c;上手即用&#xff0c;操作简单。 一、创建小程序二、页面实现三、代码块一、创建小程序 访问微信公众平台&#xff0c;点击账号注册。 选择小程序&#xff0c;并在表单填写所需的各项信息进行注册。 在开发管理选择开…

rancher部署nginx服务

前言&#xff1a;目前主流的开发模式是前后端分离&#xff0c;前端也会单独打包进行部署&#xff0c;一般就是把前端打包好的文件放到nginx目录下&#xff0c;和nginx一起部署&#xff0c;最终通过nginx来访问。 通用的dockerfile文件&#xff0c;用来构建nginx镜像 FROM ngi…

如何从测试新手变成测试大牛

如何从测试新手变成测试大牛,作为一个刚入行的测试新手&#xff0c;如何让自己提升自身能力&#xff0c;变成一个无所不能的测试大牛&#xff0c;本文将从多个方面来告诉你努力的方向&#xff0c;希望能帮助到你。 一&#xff1a;扎实的测试理论知识 作为一个测试人&#xff0…

nvcc编译器之编译内幕(chapter 23)

目录 2. 编译阶段&#xff08;步骤&#xff09; 2.1 NVCC预定义宏 2.2 NVCC编译步骤 2.3 NVCC支持的文件后缀 2.4 支持的编译阶段 3. CUDA 编译内幕 2. 编译阶段&#xff08;步骤&#xff09; 2.1 NVCC预定义宏 __NVCC__ 在编译C/C/CUDA源文件时定义 __CUDACC__ 在编译…

[附源码]java毕业设计教师教学评价系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

java之你真正了解抽象类和接口嘛?

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《java练级之旅》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我…

Nexus私服仓库Linux、Windows部署教程

Nexus 概述 Nexus 是 Sonatype 公司发布的一款仓库&#xff08;Repository&#xff09;管理软件&#xff0c;常用来搭建 Maven 私服&#xff0c;所以也有人将 Nexus 称为“Maven仓库管理器”。 主流的 Maven 仓库管理器主要有以下 3 种&#xff1a;Apache Archiva、JFrog Arti…

软考信息安全工程师案列分析

1.第一题 1.动态存储区&#xff0c;分配存储空间和释放存储空间 3.让argv[]中的第9个字符是十进制65即可。 4.缓冲区溢出漏洞&#xff0c;使用安全的strcpy函数&#xff0c;检测边界 第二题 第三题 1.保证M完整性 不能交换&#xff0c;先hash摘要可以减少加密的计算量。 2.实现…

STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

STM8S系列基于STVD开发&#xff0c;自定义printf函数TIM5精确延时函数模块化工程示例&#x1f3ac;功能演示 ✨本例也是结合了网络上收集来的printf自定义内容&#xff0c;将其功能模块化&#xff0c;方便移植使用&#xff0c;灵活性很强。 &#x1f4da;相关篇内容《STM8S903…

leetcode:792. 匹配子序列的单词数【子序列二分优化模板 + 大的字符串不变的二分优化】

目录题目截图题目分析ac code总结题目截图 题目分析 简单的子序列判断需要on&#xff0c;那么最后最坏就是omn&#xff0c;25 * 10 ^ 7爆炸因此需要优化子序列判断注意到此时的大字符串是同一个记录每个字母出现的下标遍历word&#xff0c;找到下一个最近的字母出现的位置&…

C++【C++11】

文章目录一、统一的列表初始化1.用{}来初始化元素2.initializer_list二、自动类型推断3.auto4.decltype三、指针5.nullptr6.范围for四、STL中的一些新变化1.新增加的容器2.容器内部的变化一、统一的列表初始化 1.用{}来初始化元素 在C98中&#xff0c;标准允许使用花括号{}对…

搭建java部署环境以及部署Web项目到Linux

系列文章目录 Linux 环境搭建以及xshell远程连接_crazy_xieyi的博客-CSDN博客 Linux常用命令详解_crazy_xieyi的博客-CSDN博客 Linux权限_crazy_xieyi的博客-CSDN博客 文章目录 一、搭建java部署环境 1.yum 2.JDK 3.Maven 4.Tomcat 5.MySQL二、部署…

PacBio三代全长扩增子测序对珊瑚共生虫黄藻和细菌群落进行精确分类

研究背景 珊瑚与其共生微生物群落统称为珊瑚共生功能体&#xff0c;包含了光合甲藻以及与其保持长期互利共生关系的细菌、古菌、真菌、原生动物以及病毒等一系列微生物。这些与珊瑚相关的微生物在其宿主的适应性和生存中起着重要的作用。本研究利用PacBio全长16S rRNA和ITS测序…

【Spring】一文带你吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录&#x1f496;Spring集成MyBatis✨怎么使用mybatis✨集成的步骤✨创建数据库表✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件✨测试集成MyBatis✨使用外部属性配置文件&#x1f496;投票传送…