图片/视频上传(超简单教程)

news2024/11/25 7:04:29

#应用场景#

  • 该后端开发接口适用  图片/视频上传,返回路径名称场景

1.视频上传

写在Controller层

这里只是一个接收,调用uploadObject方法上传oss

public OmsResult<FileUploadDto> goodsUploadVideo(@RequestParam(value = "file") MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response) {
        FileUploadDto fileUploadDto = new FileUploadDto();
        if (null == multipartFile) {
            return OmsResult.error("文件传输格式错误");
        }

        String originalFilename = multipartFile.getOriginalFilename();
        if (StringUtil.isEmpty(originalFilename)) {
            return OmsResult.error("文件名缺失");
        }

        if (originalFilename != null) {
            // 校验文件扩展名
            if (!checkFormatVideo(originalFilename)) {
                return OmsResult.error("仅支持mp4, mov, m4v, flv, x-flv, mkv, wmv, avi格式");
            }

            // 校验文件大小
            if (multipartFile.getSize() > FileSizeConstant.FILE_20MB) {
                return OmsResult.error("文件大小不得超过20MB");
            }

            try {
                String[] split = originalFilename.split("\\.");
                // 拼接上传文件名GV+当前时间(24小时)+随机数
                String fileName = "GV" + "当前时间" + randomLetterGenerator() + "." + split[1];

                // 获取文件输入流
                InputStream inputStream = multipartFile.getInputStream();
                //上传文件到OSS
                //这行代码调用ossClient对象的uploadObject2OSS4SimplePathByIn方法,将文件上传到OSS。其中,inputStream是文件输入流,fileName是文件名,GV是文件在OSS中的存储路径前缀
                String url = ossClient.uploadObject(inputStream, fileName, "GV");
                log.info("goodsUploadVideo URL:{}", url);
                fileUploadDto.setFileUrl(fileName);
                fileUploadDto.setVideoSize(String.valueOf(multipartFile.getSize()));
                return OmsResult.success(fileUploadDto);
            } catch (Exception e) {
                log.error("goodsUploadVideo Error", e);
                return OmsResult.error("上传文件失败");
            }
      
    /**
     * 随机生成4位大写英文字母
     * @return
     */
    private String randomLetterGenerator() {
        SecureRandom random = new SecureRandom();
        StringBuilder randomLetters = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int index = random.nextInt(26);
            char letter = (char) ('a' + index);
            randomLetters.append(letter);
        }
        return randomLetters.toString();
    }

后缀校验

private boolean checkFormatVideo(String originalFilename) {
        if (StringUtil.isEmpty(originalFilename)) {
            return false;
        }
        String s = originalFilename.toLowerCase();
        //需要什么自己加后缀
        return s.endsWith(".mp4") || s.endsWith(".mov") || s.endsWith(".m4v") || s.endsWith(".flv")
                || s.endsWith(".x-flv") || s.endsWith(".mkv") || s.endsWith(".wmv") || s.endsWith(".avi");
    }

⭐最后说下uploadObject这个方法

这部分一般公司都有公共的轮子

public String uploadObject(InputStream in, String fileName, String folder, String... bucketName) {
        if (StringUtils.isEmpty(folder)) {
            folder = "";
        }

        String bucketNameTmp = this.bucketName;
        if (bucketName != null && bucketName.length > 0) {
            bucketNameTmp = bucketName[0];
        }

        String url = null;

 try {
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength((long)in.available());
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma", "no-cache");
            metadata.setContentEncoding("utf-8");
            metadata.setContentType(this.getContentType(fileName));
            metadata.setContentDisposition("filename/filesize=" + fileName);
            PutObjectResult putResult = this.ossClientConfig.putObject(bucketNameTmp, folder + fileName, in, metadata);
            String resultStr = putResult.getETag();
            if (StringUtils.isNotEmpty(resultStr)) {
                url = folder + fileName;
            }
        } catch (Exception var10) {
            var10.printStackTrace();
            log.error("上传阿里云OSS服务器异常." + var10.getMessage(), var10);
        }

        return url;
    }

这个是用于将文件上传到阿里云对象存储服务(OSS)的Java方法

  • 使用ossClientConfig对象的putObject方法执行上传操作。这个方法需要存储桶名称、文件路径(文件夹+文件名)、输入流和元数据信息。
  • PutObjectResult对象中获取ETag(一个代表文件内容的哈希值),并检查它是否为空。如果不为空,则设置url为上传文件的路径(文件夹+文件名)。
  • 如果在上传过程中发生异常,则捕获该异常并打印堆栈跟踪,并记录错误日志。

前端vue逻辑和oss方法可以参考一下这篇文章

http://t.csdnimg.cn/2yaig

2.图片上传

controller逻辑

public void uploadImportFile(@RequestParam("fileImport") MultipartFile fileImport, HttpServletRequest request, HttpServletResponse response) {
        JSONObject result = new JSONObject();
        BufferedInputStream in = null;
        try {
            // 上传文件类型 1商贸店铺申请附件 2商贸店铺LOGO附件 3其他
            String fileType = request.getParameter("fileType");
            if (null == fileImport || StringUtils.isBlank(fileImport.getOriginalFilename())) {
                result.put(ResponseConstant.RESPONSE_CODE, "400");
                result.put(ResponseConstant.RESPONSE_MSG, "上传的文件为空,请重新上传");
                this.writeData(result, response);
                return;
            }
            String fileName = fileImport.getOriginalFilename();
           // 判断文件大小
            if ("1".equals(fileType) || "2".equals(fileType)) {
                if("1".equals(fileType)){
                    if (fileImport.getSize() > FileSizeConstant.FILE_1MB) {
                        result.put(ResponseConstant.RESPONSE_CODE, "400");
                        result.put(ResponseConstant.RESPONSE_MSG, "当前上传的文件过大,大小不能超出1M");
                        this.writeData(result, response);
                        return;
                    }
                } else if ("2".equals(fileType) && fileImport.getSize() > FileSizeConstant.FILE_20MB) {
                    result.put(ResponseConstant.RESPONSE_CODE, "400");
                    result.put(ResponseConstant.RESPONSE_MSG, "当前上传的文件过大,大小不能超出20M");
                  if (!fileName.endsWith(".png") && !fileName.endsWith(".jpeg") && !fileName.endsWith(".jpg")) {
                    result.put(ResponseConstant.RESPONSE_CODE, "400");
                    result.put(ResponseConstant.RESPONSE_MSG, "上传的文件类型错误,请重新上传,只支持png、jpeg、jpg格式文件");
                    this.writeData(result, response);
                    return;
                }
            } else {
                if (fileImport.getSize() > FileSizeConstant.FILE_32MB) {
                    result.put(ResponseConstant.RESPONSE_CODE, "400");
                    result.put(ResponseConstant.RESPONSE_MSG, "当前上传的文件过大,大小不能超出32M");
                    this.writeData(result, response);
                    return;
                }
                if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")
                        && !fileName.endsWith(".pdf") && !fileName.endsWith(".png") && !fileName.endsWith(".jpeg") && !fileName.endsWith(".jpg")
                        && !fileName.endsWith(".rar") && !fileName.endsWith(".zip")) {
                    result.put(ResponseConstant.RESPONSE_CODE, "400");
                    result.put(ResponseConstant.RESPONSE_MSG, "上传的文件类型错误,请重新上传,pdf、png、jpeg、jpg、xls、xlsx、rar、zip");
                    this.writeData(result, response);
                    return;
                }
            }
//上传文件的时间
            String uploadTime = DateUtils.getToday("yyyyMMddHHmmssSSS") + SaltUtil.getRandom();
            String fileNameNew = uploadTime + SaltUtil.randomGenerate() + fileName.substring(fileName.lastIndexOf("."));
            in = new BufferedInputStream(fileImport.getInputStream());
            String url = ossClient.uploadObject(in, fileNameNew, null);
            if (StringUtils.isNotBlank(url)) {
                result.put(ResponseConstant.RESPONSE_CODE, "200");
                result.put(ResponseConstant.RESPONSE_MSG, "上传成功");
                result.put("data", url);
                this.writeData(result, response);
            } else {
                result.put(ResponseConstant.RESPONSE_CODE, "400");
                result.put(ResponseConstant.RESPONSE_MSG, "上传失败,请重新上传");
                this.writeData(result, response);
            }
        } catch (Exception e) {
           log.error("上传文件异常:{}", e);
            result.put(ResponseConstant.RESPONSE_CODE, "500");
            result.put(ResponseConstant.RESPONSE_MSG, "系统繁忙,请稍后重试");
            this.writeData(result, response);
        } finally {
            IOUtils.closeQuietly(in);
        }
    }

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

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

相关文章

SQL优化——执行计划

文章目录 1、获取执行计划常用方法1.1、使用AUTOTRACE查看执行计划1.2、使用EXPLAIN PLAN FOR查看执行计划1.3、查看带有A-TIME的执行计划1.4、查看正在执行的SQL的执行计划 2、定制执行计划3、怎么通过查看执行计划建立索引4、运用光标移动大法阅读执行计划 SQL执行缓慢有很多…

ubuntu环境下使用g++把c++编译成汇编语言(暂时)

1. 引言 为了深入理解c&#xff0c;决定学习一些简单的汇编语言。使用ubuntu系统下g很容易将一个c的文件编译成汇编语言。本文使用此方法&#xff0c;对一个简单的c文件编译成汇编语言进行理解。 2.示例 文件名&#xff1a;reorder_demo.cpp #include<stdio.h>typede…

【网络运维知识】—路由器与交换机区别

【网络运维知识】—路由器与交换机区别 一、路由器&#xff08;Router&#xff09;和交换机&#xff08;Switch&#xff09;对比1.1 功能1.2 转发方式1.3 范围1.4 处理方式 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 路由器&#xff08…

MySQL8.0 一主二从

1. 系统环境 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)192.168.183.137 mysql-master 192.168.183.153 mysql-slave-1 192.168.183.154 mysql-slave-2# 关闭SELINUX sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config seten…

基于SpringBoot的幼儿园管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7 数据表&#xff1a;16张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;html 后端技术&#xff1a;SpringBoot 功能简介 项目获取关键字&#xff1a;幼儿园 该…

React-css-in-js技术

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:React-css-in-js技术 目录 1、简介 2、定义样式与使用 3、样式继承 4、属性传递 1、简介 …

买婴儿洗衣机怎么选择?四大绝佳好用婴儿洗衣机分享

幼龄时期的宝宝的衣物&#xff0c;是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察&#xff0c;然后在宝宝洗衣服的这上面多下点功夫&#xff0c;不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

IP地址怎么实现https

IP可以申请SSL证书。可以解决企业需要对IP实现https加密的需求&#xff0c;一张证书可以支持同时绑定多个IP。 IP证书有两种级别&#xff1a;基础级IP SSL证书和标准企业级IP SSL证书。 基础型SSL证书只需要10-30分钟即可颁发&#xff0c;企业型需要1-3个工作日即可颁发。 企…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

deepspeed笔记

文章目录 一、deepspeed是什么&#xff1f;二、能训多大的模型&#xff0c;耗时如何&#xff1f;三、RLHF训练流程四、通信策略 一、deepspeed是什么&#xff1f; 传统的深度学习&#xff0c;模型训练并行&#xff0c;是将模型参数复制多份到多张GPU上&#xff0c;只将数据拆分…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果&#xff1a; 实现基本的功能&#xff1a; 根据游戏进程解释代码&#xff1a; 游戏初始化&#xff1a; 首先进入游戏&#xff0c;我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来&#xff1a; 然后…

数据可视化插件echarts【前端】

数据可视化插件echarts【前端】 前言版权开源推荐数据可视化插件echarts一、如何使用1.1 下载1.2 找到js文件1.3 入门使用1.4 我的使用 二、前后端交互&#xff1a;入门demo2.1 前端htmljs 2.2 后端entitycontrollerservicemapper 三、前后端交互&#xff1a;动态数据3.1 前端j…

书生·浦语大模型全链路开源体系-第6课

书生浦语大模型全链路开源体系-第6课 书生浦语大模型全链路开源体系-第6课相关资源Lagent & AgentLego 智能体应用搭建环境准备创建虚拟环境安装LMDeploy安装 Lagent安装 AgentLego Lagent 轻量级智能体框架使用 LMDeploy 部署启动并使用 Lagent Web Demo使用自定义工具获取…

mysql的mgr集群的网络不可达之后脑裂的问题

此时主节点上的dml和ddl操作都会挂死&#xff0c;由于脑裂问题&#xff0c;无法判断谁是主谁是备&#xff0c;所以节点无法写操作。 此时需要手动介入处理&#xff1a; mysql> show variables like %group_replication_member_expel_timeout%; ---------------------------…

Java上机实验报告(7)

实验 &#xff08;7&#xff09; 项目名称&#xff1a;组件及事件处理-注册页面 一、 实验报告内容一般包括以下几个内容&#xff1a; 实验项目名称 实验7 组件及事件处理-注册页面 实验目的和要求 本实验的目的&#xff1a; 本实验的目的是让学生掌握常用的组件类JButton&am…

空气源热泵电控系统部分控制功能的逻辑

空气源热泵的电控系统&#xff0c;是一台空气源热泵设备的大脑&#xff0c;电控系统逻辑的合理性、执行的精准性&#xff0c;直接决定设备运行的稳定、能效高低、运行寿命。 控制功能 &#xff08;1&#xff09;压缩机防频繁起停 压缩机再次启动间隔时间为3分钟&#xff0c;即压…

果园系统养殖游戏喂养偷菜种植浇水养成小程序功能介绍

以下是上述功能介绍的重写版本&#xff1a; 装扮 使用丰富的材料&#xff0c;为您的房屋增添独特魅力&#xff0c;展现个性化装饰风格。 土地升级 投入不同数量的材料&#xff0c;提升房屋与土地的品质&#xff0c;打造独一无二的庄园。 日志 通过日志记录&#xff0c;清…

Flask实战

from flask import Flask appFlask(__name__)点击Flask同时点击键盘ctrl即可查看Flask的默认初始化函数 def __init__(self,import_name: str,static_url_path: str | None None,static_folder: str | os.PathLike[str] | None "static",static_host: str | None …

LeetCode-31-下一个排列问题

题目说明 实现获取下一个排列的函数&#xff0c;算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列&#xff0c;则将数字重新排列成最小的排列&#xff08;即升序排列&#xff09;。 必须原地修改&#xff0c;只允许使用额外常数空间。…

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…