图片上传删除下载

news2024/9/20 15:20:51

文件上传删除,下载功能

 /**
     * @description: 样品制作单上传附件到存储桶,返回url给前端
     * @param: [file]
     * @return: com.bsn.common.core.domain.AjaxResult
     * @author 沈三靖
     * @date: 2024/9/19 16:44
     */
    @ApiOperation(value = "上传附件", notes = "上传附件(图片)", httpMethod = "POST")
    @Log(title = "上传附件", businessType = BusinessType.UPDATE)
    @PostMapping("/imgUrl")
    public AjaxResult avatar(@RequestParam("imgUrl") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            String avatar = FileUploadUtils.uploadMinio(file);
            if (avatar != null&&avatar.length()>0) {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", avatar);
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常,请联系管理员");
    }
    /**
     * @description: 样品制作单根据制作单id修改上传附件到存储桶,返回url给前端
     * @param: [file]
     * @return: com.bsn.common.core.domain.AjaxResult
     * @author 沈三靖
     * @date: 2024/9/19 16:44
     */
    @ApiOperation(value = "根据样品制作单id修改上传附件", notes = "根据样品制作单id修改上传附件(图片)", httpMethod = "POST")
    @Log(title = "根据样品制作单id修改上传附件", businessType = BusinessType.UPDATE)
    @PostMapping("/updateImgUrl")
    public AjaxResult updateavatar(@RequestParam("imgUrl") MultipartFile file,@RequestParam("prototypeMakeId") String prototypeMakeId) throws IOException {
        Long aLong=0l;
        if (!prototypeMakeId.isEmpty()&&!prototypeMakeId.equals("")){
            aLong = Long.valueOf(prototypeMakeId);
        }

        if (!file.isEmpty()) {
            String avatar = FileUploadUtils.uploadMinio(file);

            if (proPrototypeMakeService.updatImageUrl(aLong,avatar)) {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", avatar);
                return ajax;
            }
        }else{
            if (proPrototypeMakeService.updatImageUrl(aLong,"")) {
                AjaxResult ajax = AjaxResult.success();
                ajax.put("imgUrl", "");
                return ajax;
            }
        }
        return AjaxResult.error("上传图片异常,请联系管理员");
    }
    @ApiOperation(value = "下载附件", notes = "下载附件(图片)", httpMethod = "GET")
    @Log(title = "下载附件", businessType = BusinessType.UPDATE)
    @GetMapping("/download")
    public void downloadAvatar(@RequestParam("imgUrl") String imgUrl,HttpServletResponse response) throws IOException {
        // 创建URL对象
        URL url = new URL(imgUrl);
        //打开链接
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 设置应用程序要从网络连接读取数据
        conn.setDoInput(true);
        //设置请求方式为"GET"
        conn.setRequestMethod("GET");
        // 获取 Content-Type
        String contentType = conn.getContentType();
        response.setContentType(contentType);
        // 根据 URL 获取文件名
        String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1);
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        InputStream inputStream = conn.getInputStream();
        OutputStream outputStream = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
    }

文件上传工具类

/**
 * 文件上传工具类
 */
public class FileUploadUtils {
    /**
     * 默认大小 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;

    /**
     * 默认的文件名最大长度 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;

    /**
     * 默认上传的地址
     */
    private static String defaultBaseDir = BsnEpConfig.getProfile();

    public static void setDefaultBaseDir(String defaultBaseDir) {
        FileUploadUtils.defaultBaseDir = defaultBaseDir;
    }

    public static String getDefaultBaseDir() {
        return defaultBaseDir;
    }


    /**
     * Minio默认上传的地址
     */
    private static String bucketName = MinioConfig.getBucketName();

    public static String getBucketName() {
        return bucketName;
    }

    /**
     * 以默认配置进行文件上传
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String upload(MultipartFile file) throws IOException {
        try {
            return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file    上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException {
        try {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 文件上传
     *
     * @param baseDir          相对应用的基目录
     * @param file             上传的文件
     * @param allowedExtension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException       如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException                          比如读写文件出错时
     * @throws InvalidExtensionException            文件校验异常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }

        assertAllowed(file, allowedExtension);

        String fileName = extractFilename(file);

        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
        file.transferTo(Paths.get(absPath));
        return getPathFileName(baseDir, fileName);
    }

    /**
     * 以默认BucketName配置上传到Minio服务器
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String uploadMinio(MultipartFile file) throws IOException {
        try {
            return uploadMinino(getBucketName(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }

    /**
     * 自定义bucketName配置上传到Minio服务器
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String uploadMinio(MultipartFile file, String bucketName) throws IOException {
        try {
            return uploadMinino(bucketName, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }

    private static final String uploadMinino(String bucketName, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException {
        int fileNamelength = file.getOriginalFilename().length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        assertAllowed(file, allowedExtension);
        try {
            String fileName = extractFilename2(file);
            String pathFileName = MinioUtil.uploadFile(bucketName, fileName, file);
            return pathFileName;
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }


    /**
     * 编码文件名
     */
    public static final String extractFilename(MultipartFile file) {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
    }


    /**
     * 编码文件名
     */
    public static String extractFilename2(MultipartFile file) {
        final String suffix = FileUtil.getSuffix(file.getOriginalFilename());
        final String s = StrUtil.emptyToDefault(suffix, MimeTypeUtils.getExtension(StrUtil.nullToDefault(file.getContentType(), MimeTypeUtils.IMAGE_PNG)));
        String newFile = DateTime.now().toString(DatePattern.PURE_DATETIME_MS_PATTERN + RandomUtil.randomNumbers(6)) + StrUtil.DOT + s;

        return StringUtils.format("{}/{}", DateUtils.datePath(), newFile);
    }

    public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
        File desc = new File(uploadDir + File.separator + fileName);

        if (!desc.exists()) {
            if (!desc.getParentFile().exists()) {
                desc.getParentFile().mkdirs();
            }
        }
        return desc;
    }

    public static final String getPathFileName(String uploadDir, String fileName) throws IOException {
        int dirLastIndex = BsnEpConfig.getProfile().length() + 1;
        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
        return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
    }

    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     * @return
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws InvalidExtensionException
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException {
        long size = file.getSize();
        if (size > DEFAULT_MAX_SIZE) {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }

        String fileName = file.getOriginalFilename();
        String extension = getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) {
                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
                        fileName);
            } else {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }

    }

    /**
     * 判断MIME类型是否是允许的MIME类型
     *
     * @param extension
     * @param allowedExtension
     * @return
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
        for (String str : allowedExtension) {
            if (str.equalsIgnoreCase(extension)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取文件名的后缀
     *
     * @param file 表单文件
     * @return 后缀名
     */
    public static final String getExtension(MultipartFile file) {
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (StringUtils.isEmpty(extension)) {
            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
        }
        return extension;
    }
}

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

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

相关文章

展会上想要留住俄罗斯客户,柯桥成人俄语培训

展品 экспонат 模型 макет 证明(书) свидетельство 预算 бюджет 确认订单 подтверждение заказа 缺点,毛病,缺陷 недостаток 退换 возвращать 更换 заменять 调整 урегулир…

[PTA]7-1 谁管谁叫爹

[PTA]7-1 谁管谁叫爹 输入格式: 输入第一行给出一个正整数 N(≤100),为游戏的次数。以下 N 行,每行给出一对不超过 9 位数的正整数,对应 A 和 B 给出的原始数字。题目保证两个数字不相等。 输出格式&…

虹科干货 | CAN/CAN FD故障揭秘:快速排查与解决技巧

是否在处理CAN总线问题时感到头疼?是否在寻找简单直接的方法来解决那些看似复杂的连接故障?本文将为您提供实用技巧,让您能够轻松应对这些难题。 CAN总线因其高效、可靠的数据交换能力,在汽车、工业控制、航空航天等多个关键领域得…

【软件方案】智慧社区总体解决方案(PPT原件)

1.智慧社区整体建设方案内容 2.整体功能介绍 软件全套资料部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书&…

故障模拟测试负载是如何实现的

故障模拟测试负载是在系统或设备上故意引入故障,以测试其应对能力的方法。这种方法可以帮助我们了解系统在面临各种故障时的响应和恢复能力,从而提高系统的可靠性和稳定性。故障模拟测试负载的实现主要依赖于以下几个步骤: 1. 确定故障类型&…

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点

uniapp快速入门教程,内容来源于官方文档,仅仅记录快速入门需要了解到的知识点 目录 介绍uniapp 介绍uniapp x 介绍功能框架图创建项目&发布组件/标签的变化js的变化css的变化工程结构和页面管理 pages.jsonmanifest.json 应用配置组件easycom组件规…

【Unity杂谈】iOS 18中文字体显示问题的调查

一、问题现象 最近苹果iOS 18系统正式版推送,周围升级系统的同事越来越多,有些同事发现,iOS 18上很多游戏(尤其是海外游戏)的中文版,显示的字很奇怪,就像一些字被“吞掉了”,无法显示…

MongoDB解说

MongoDB 是一个流行的开源 NoSQL 数据库,它使用了一种被称为文档存储的数据库模型。 与传统的关系型数据库管理系统(RDBMS)不同,MongoDB 不使用表格来存储数据,而是使用了一种更为灵活的格式——JSON 样式的文档。 这…

详解Vite创建Vue3项目router-less-scss-pinia-持久化

前言 Vite 和 Webpack 都是现代化的前端构建工具,它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的,但它们在设计和实现方面有许多不同之处。webpack可以看我的上一篇文章 一、准备工作安装工具 这里我们简单介绍一下文章中使用到…

你必须要懂的网络安全知识

不管是网工还是运维,都应该对网络安全的重要性非常清楚,每一次数据泄露、每一次网络攻击,都可能给企业带来不可估量的损失。 从SQL注入到跨站脚本攻击(XSS),从分布式拒绝服务攻击(DDoS&#xf…

Java 数据结构 最小栈的实现

在O(N)时间复杂度内找出最小值: 创建两个栈当普通栈只有一个数据时,把该数据放入最小栈往普通栈放入数据时,把要放入的数据和最小栈的栈顶数据相比较,若要放入的数据比最小栈的栈顶数据小,则把…

容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑

在现代应用部署时中,Docker容器化技术被广泛应用。Node.js应用在容器中运行时,有时需要获取宿主机的基础信息,如系统信息、内存使用情况、磁盘空间和启动时间等。本文将介绍如何在Docker容器内的Node.js应用中获取这些信息,以及可…

数字化转型中的企业蓝图构建:基于业务能力建模的全面解读与战略实施指南

随着企业数字化转型的不断深入,业务复杂性和技术需求的多样化推动了企业架构的新变革。为了应对日益复杂的市场环境,如何构建清晰、稳定的业务蓝图成为企业成败的关键。《业务能力指南》为此提供了系统的框架和指导,帮助企业通过业务能力建模…

谷歌女高管被裁员,3份兼职越干越开心!55岁正是闯的年纪!

在职场的金字塔顶端,那些大龄女性高管正在面对一场无形却深刻的危机。曾经,她们凭借坚定的决心和无畏的勇气,在职场中披荆斩棘,闯出了一片天地。 现代职场的年轻化和技术更新正将她们逐渐推向边缘。裁员通知的突如其来&#xff0…

Vue3.0组合式API:使用ref获取DOM元素

Vue3.0组合式API系列文章: 《Vue3.0组合式API:setup()函数》 《Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象》 《Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器》 《Vue3.0组合式API&…

Go语言grequests库并发请求的实战案例

在当今快速发展的互联网时代,数据的获取和处理速度成为了衡量一个系统性能的重要标准。Go语言以其并发处理能力而闻名,而grequests库则为Go语言的HTTP请求提供了简洁易用的API。本文将通过一个实战案例,介绍如何使用Go语言的grequests库来实现…

卖家必看:利用亚马逊自养号测评精选热门产品,增强店铺权重

在亚马逊的商业版图中,选品始终占据着核心地位,是贯穿其经营策略的永恒旋律。一个商品能否脱颖而出,成为市场中的明星爆款,其关键在于卖家对产品的精挑细选,这一环节的重要性不言而喻,是决定胜负的关键所在…

C++笔记21•C++11的新特性•

相比于 C98/03,C11则带来了数量可观的变化,其中包含了约140个新特性,以及对C03标准中约600个缺陷的修正,这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言,C11能更好地用于系统开发和库开发、语法更加泛华和简…

【C语言】自定义类型——结构体

目录 一、结构体的类型的声明 二、结构体变量的创建和初始化 三、匿名结构体类型 四、结构体自引用 五、结构体内存对齐 (1)对齐规则 (2)计算结构体大小练习 (3)需要内存对齐的原因 (4…

Eigen3 教程基础篇(三)

参考 Eigen3 主页,Eigen3 官网教程 矩阵的本质,通过多种矩阵的应用去感受矩阵本质 3Blue1Brown 的线性代数,用可视化方法来表现线性代数的特性,强推 如何理解复数和虚数,有动画方便理解复数的意义 相关文章 Eigen…