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

#应用场景#

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

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);
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【力扣 Hot100 | 第七天】4.22(找到字符串中所有字母异位词)

文章目录 2.找到字符串中所有字母异位词2.1题目2.2解法&#xff1a;滑动窗口2.2.1解题思路2.2.2代码实现 2.找到字符串中所有字母异位词 2.1题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺…

28map,set关联式容器

序列式容器 vector、list、deque(单纯的纯数据) 关联式容器 map、set&#xff0c;哈希&#xff0c;&#xff0c;&#xff0c;(数据之间有很强的关联性,不是单纯的为了存储数据) Set 底层是搜索树&#xff08;红黑树&#xff09; T是key &#xff0c;compare是仿函数&#xff0…

150G全国1米分辨率土地利用数据【2023年】

#1数据摘要 全国1米分辨率土地利用数据 全国范围,分省份分类,1米精度土地利用数据。2023年版本。 数据格式:tif 坐标系:wgs1984 范围:全国各省份 时间:2023年 精度:1米 地类:共计11个地类 中国1m分辨率土地覆盖数据 文件命名与介绍:数据为GeoTIFF栅格格式,每个城市…

lvgl图形化设计工具GUI Guider结合使用

前言 上篇博客整合了lvgl到项目中&#xff0c;采用的是自己编写源码的方式&#xff0c;实现了个简单的界面。实际过程中一般情况开发界面都借助设计工具&#xff0c;这里使用的是gui guider来进行示例记录 项目结构&#xff08;生成代码路径依然放到项目路径下&#xff09; C…

知识图谱的起源与发展

文章目录 知识图谱的发展历史知识图谱的重要性知识图谱与Ontology、语义网络之间的区别知识图谱的定义 知识图谱的发展历史 知识图谱始于20世纪50年代&#xff0c;至今大致分为三个发展阶段&#xff1a;第一阶段 &#xff08;1955年—1977年&#xff09;是知识图谱的起源阶段&a…

ThingsBoard教程(二十九):详细讲解在tb平台下 http协议下的客户端rpc,服务的rpc的使用

客户端rpc 先来说一下简单的客户端rpc, 客户端发起rpc请求,只需要使用post方法调用该接口即可以 http://host:port/api/v1/$ACCESS_TOKEN/rpc请求路径中间的参数 ACCESS_TOKEN 必须是设备的访问令牌。 请求携带的参数如下,二个参数method和params {"method": …

uniapp H5的弹窗滚动穿透解决

目录 方案一 事件修饰符 overscroll-behavior 修饰符 overscroll-behavior 属性 看个案例 兼容 方案二 overflow&#xff1a;hiden 有一层遮罩蒙层覆盖在body上时&#xff0c;当我们滚动遮罩层&#xff0c;它下面的内容也会跟着一起滚动&#xff0c;看起来好像是上面的…

ChatGPT研究论文提示词集合4-【结论】、【论文写作】和【审稿与修订】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.结论 2.论文写作 3.评审和修订 4.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

Numpy方法总结(二)

一. 高级索引 相比于基本索引&#xff0c;高级索引可以访问到数组中的任意元素&#xff0c;并且可以用来对数组进行复杂的操作和修改。 1.整数数组索引 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。 示例…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

《从零开始的Java世界》07常用类与基础API

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

尾矿库安全监测:仪器埋设与维护的关键要求

尾矿库作为矿业生产的重要组成部分&#xff0c;其安全运营对于保障人员生命安全和环境保护具有至关重要的意义。为了确保尾矿库的安全运行&#xff0c;及时发现潜在的安全隐患&#xff0c;必须采取有效的安全监测措施。本文将重点探讨尾矿库安全监测仪器的埋设及维护要求。 一、…

​「Python绘图」绘制皮卡丘

python 绘制皮卡丘 一、预期结果 二、关键代码 import turtle print("开始绘制皮卡丘") def getPosition(x, y):turtle.setx(x)turtle.sety(y)print(x, y)class Pikachu:def __init__(self):self.t turtle.Turtle()t self.tt.pensize(3)t.speed(190)t.ondrag(getP…

Linux命令接着学习

which命令&#xff0c;找到各种命令程序所处在的位置 语法&#xff1a;which查找的命令 那么对于我们想查找其他类型文件所在的位置&#xff0c;我们可以用到find命令 find命令 选项为-name&#xff0c;表示按照文件名进行查找 find命令中通配符 find命令和前面rm命令一样&…

Linux及tmux、vim常用命令

Linux 关于Linux的简介、诞生、迭代&#xff0c;大家可以去网上查一查&#xff0c;这里不多做赘述了 Linux文件类型 非常重要的文件类型有: 普通文件&#xff0c;目录文件&#xff0c;链接文件&#xff0c;设备文件&#xff0c;管道文件&#xff0c;Socket 套接字文件 等。 …

2024团体设计天梯赛之L1-101 别再来这么多猫娘了

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

D咖饮品机器人惊艳亮相:智能硬件改变生活习惯

在当今快节奏的生活中&#xff0c;人们对于便捷、高效的需求日益增长&#xff0c;智能硬件应运而生&#xff0c;其中饮品机器人作为一种新型的智能设备&#xff0c;正在以惊艳的姿态亮相于人们的生活中&#xff0c;为人们带来了全新的消费体验&#xff0c;改变着大众的生活习惯…

CV算法工程师的LLM日志(5)Mixture-of-depths——transformers改进结构 【15分钟代码和原理速通】

前言 简而言之&#xff0c;这是google对transformer一些改进设计&#xff0c;如果这个有效性能够证明并普及&#xff0c;那么下一个大模型的transformer范式就是这个了&#xff0c;当然同时也存在mamba和transformer的jamba崛起&#xff0c;不过现在主流还是transformer&#…

nlp 自然语言处理的dataset数据库积累

下面的这个和 entity recognition有关的。 Weights & Biases