如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

news2024/12/24 21:21:29

一、开通阿里云OSS对象存储服务

对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务,提供 99.995 % 的服务可用性和多种存储类型,适用于数据湖存储,数据迁移,企业数据管理,数据处理等多种场景,可对接多种计算分析平台,直接进行数据处理与分析,打破数据孤岛,优化存储成本,提升业务价值。icon-default.png?t=N7T8https://www.aliyun.com/product/oss?spm=5176.8465980.unusable.ddetail.7df51450v1aNb1

二、创建存储空间

1、创建Bucket

 2、完成创建Bucket

 三、申请AccessKey

 

 四、代码实现

1、导入依赖

  <dependency>
       <groupId>com.aliyun.oss</groupId>
       <artifactId>aliyun-sdk-oss</artifactId>
       <version>3.10.2</version>
    </dependency>
 <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>选择你的版本</version>
        </dependency>

2、创建对应的工具类AliOssUtil类,此代码是固定代码,直接CV即可。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
 
@Data
@AllArgsConstructor
//固定代码,CV直接使用
public class AliOssUtil {
 
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
 
    /**
     * 文件上传
     *
     * @param bytes :传入的文件要转为byte[]
     * @param objectName :表示在oss中存储的文件名字。
     * @return
     */
    public String upload(byte[] bytes, String objectName) {
 
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
 
        try {
            // 创建PutObject请求。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
 
        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);
 
        return stringBuilder.toString();
    }
}

3、配置阿里云OSS

aliyun.oss.bucketName = scl-oss-test
aliyun.oss.endpoint = oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId = 
aliyun.oss.accessKeySecret = 

4、配置相应model类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;


}

5、将工具类配置到ioc容器中,便于后续的使用。

import com.fpl.model.AliOssProperties;
import com.fpl.utils.AliOssUtil;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OssConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public AliOssUtil getAliOssUtil(AliOssProperties aliOssProperties) {
//        log.info("创建OssUtil");
        AliOssUtil aliOssUtil = new AliOssUtil(
                aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName()
        );
        return aliOssUtil;
    }
}

五、结合上传pdf使用

上篇文章有介绍pdf使用。SpringBoot整合PDF动态填充数据并下载!!!-CSDN博客文章浏览阅读106次。TextPDF(现在也称为iText 7)是一款强大的Java库,专门用于创建、填充、阅读、操纵和维护PDF文档。:iTextPDF能够从零开始创建PDF文档,也可以读取已有的PDF文件并对其中的内容进行修改,如添加、删除或更新页面内容。:可以在PDF文档中插入文本、图片、图表等内容。:支持复杂表格的创建和填充,包括单元格合并、样式设定等。:支持创建和填充交互式PDF表单,包括文本字段、复选框、列表框等,并且可以对表单域进行读写操作。:提供对PDF文档进行数字签名的支持,确保文档的安全性和完整性。https://blog.csdn.net/qq_64847107/article/details/137959658?spm=1001.2014.3001.5502

1、将pdf模板上传到阿里云

 2、修改上传pdf的代码实现将pdf上传到阿里云

其实就是修改了三句代码:

package com.by.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;
import com.by.util.AliOssUtil;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

/**
 * 控制器类,用于处理PDF模板填充及下载请求
 */
@RestController
public class PdfController {
    @Autowired
    private AliOssUtil aliOssUtil;

    /**
     * 处理GET请求以下载填充了数据的PDF文件
     *
     * @param response HttpServletResponse对象,用于设置响应头和发送下载文件
     * @return 响应实体,包含填充好数据的PDF字节流
     * @throws IOException 如果读取或写入PDF文件时发生异常
     */
    @GetMapping("/download")
    public ResponseEntity<byte[]> test(HttpServletResponse response) throws IOException {
        // 设置响应头,指示浏览器以附件形式下载文件,并设置文件名
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        String downloadFileName = System.currentTimeMillis() + ".pdf";
        response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);

        // 准备需要填充到PDF模板中的数据
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("name", "可口可乐");
        dataMap.put("code", "350ml");

        // 填充数据并生成带数据的PDF字节流
        byte[] pdfBytes = getPdf(dataMap);

        //上传到oss
        aliOssUtil.upload(pdfBytes, downloadFileName);

        // 创建并返回包含填充后PDF字节流的响应实体
        return new ResponseEntity<>(pdfBytes, headers, HttpStatus.CREATED);
    }

    /**
     * 根据提供的数据填充PDF模板并返回填充后的PDF字节流
     *
     * @param dataMap 需要填充到PDF模板中的键值对数据
     * @return 填充好数据的PDF文件字节数组
     * @throws IOException 如果读取或写入PDF文件时发生异常
     */
    private byte[] getPdf(Map<String, String> dataMap) throws IOException {
        //获取阿里云OSS上传的pdf模板
        String fileUrl = "https://scl-oss-test.oss-cn-beijing.aliyuncs.com/1.pdf";

        //将文件下载后保存在E盘,返回结果为下载文件大小
        long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("C:/Users/admin/Desktop"));

        // 获取PDF模板文件路径
        File sourcePdf = ResourceUtils.getFile("C:/Users/admin/Desktop/1.pdf");

        // 使用PDF阅读器加载模板文件
        PdfReader pdfReader = new PdfReader(new FileInputStream(sourcePdf));

        // 创建一个内存输出流用于存储填充好数据的PDF文件
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        // 创建PDF文档对象,连接读取器和输出流
        PdfDocument pdf = new PdfDocument(pdfReader, new PdfWriter(outputStream));

        // 设置默认页面大小为A4
        pdf.setDefaultPageSize(PageSize.A4);

        // 获取PDF表单域对象
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
        Map<String, PdfFormField> fields = form.getFormFields();

        // 设置字体,这里使用的是"STSong-Light"字体
        PdfFont currentFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);

        // 遍历待填充的数据,并将其填入对应的表单域
        dataMap.forEach((key, value) -> {
            Optional<PdfFormField> formFieldOptional = Optional.ofNullable(fields.get(key));
            formFieldOptional.ifPresent(formField -> {
                // 设置字体并替换表单域的值
                formField.setFont(currentFont).setValue(value);
            });
        });

        // 锁定并合并所有表单域,使其无法再编辑
        form.flattenFields();

        // 关闭PDF文档,释放资源
        pdf.close();

        // 将填充好的PDF文件转换为字节数组并返回
        return outputStream.toByteArray();
    }
}

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

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

相关文章

遥瞻智慧:排水系统远程监控的卓越解决方案

遥瞻智慧&#xff1a;排水系统远程监控的卓越解决方案 在城市脉络的深层肌理中&#xff0c;排水系统犹如一条条隐秘的生命线&#xff0c;默默承载着城市的呼吸与律动。然而&#xff0c;如何以科技之眼&#xff0c;赋予这些无形网络以实时感知、精准调控的能力&#xff0c;使之…

FMEA与特殊特性之间的关联——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在汽车、机械、电子等制造行业中&#xff0c;质量管理和风险控制是确保产品安全和性能至关重要的环节。在这个过程中&#xff0c;FMEA&#xff08;故障模式与影响分析&#xff09;和特殊特性分析是两个常用的工具和方法。本文将探讨FMEA与特殊…

多模态大模型训练数据以及微调数据格式

多模态数据&#xff0c;尤其是中文多模态数据&#xff0c;找一些中文多模态的数据 中文多模态数据集汇总_数据集-阿里云天池本文整理汇总了业界常用的多模态中文数据集&#xff0c;提供了每个数据集的简介、官网、下载地址、Github代码等信息&#xff0c;方便算法研究人员学习…

「探索C语言内存:动态内存管理解析」

&#x1f320;先赞后看&#xff0c;不足指正!&#x1f320; &#x1f388;这将对我有很大的帮助&#xff01;&#x1f388; &#x1f4dd;所属专栏&#xff1a;C语言知识 &#x1f4dd;阿哇旭的主页&#xff1a;Awas-Home page 目录 引言 1. 静态内存 2. 动态内存 2.1 动态内…

Windows远程桌面连接虚拟机Linux

Windows远程桌面连接虚拟机Linux 需要先打开虚拟机的启用VNC连接使用VNC客户端进行连接 yum install -y tigervnc-server #安装tigervnc-server vncserver #启动一个vnc进程 #第一次启动会要求设置密码 #如果需要更改密码可以使用vncpasswd进行更改密码 vncserver -list #查看…

【Linux实践室】Linux高级用户管理实战指南:Linux用户与用户组编辑操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux查看用户属性命令2.1.1 &#x1f47b;…

数据结构-上三角矩阵存储方式[0知识掌握]

目标&#xff1a;看完本文章你将会了解上三角矩阵的存储方式以及矩阵中数据的位置索引号如何求 难点&#xff1a;上三角矩阵的公式推导&#xff0c;上三角任意位置对应的存储位置。 一、准备知识 1.求和公式 前n项和&#xff1a;Sn n(a1an)/2 公差&#xff1a;d后项-前项…

易保全网络赋强公证系统,前置预防、快速化解债权纠纷

网络赋强公证是一种创新的法律服务模式&#xff0c;为金融机构和债权人提供了一种便捷、高效的债权保障方式。既可以加大对违约方的司法震慑力&#xff0c;又能降低维权方实现债权的风险&#xff0c;且执行时间更快&#xff0c;债权周期更短&#xff0c;诉讼费用更低&#xff0…

OpenHarmony鸿蒙南向开发案例:【智能燃气检测设备】

样例简介 本文档介绍了安全厨房案例中的相关智能燃气检测设备&#xff0c;本安全厨房案例利用轻量级软总线能力&#xff0c;将两块欧智通V200Z-R/BES2600开发板模拟的智能燃气检测设备和燃气告警设备组合成。当燃气数值告警时&#xff0c;无需其它操作&#xff0c;直接通知软总…

【机器学习】分类与预测算法评价的方式介绍

一、引言 1、机器学习分类与预测算法的重要性 在数据驱动的时代&#xff0c;机器学习已经成为了处理和分析大规模数据的关键工具。分类与预测作为机器学习的两大核心任务&#xff0c;广泛应用于各个领域&#xff0c;如金融、医疗、电商等。分类算法能够对数据进行有效归类&…

登录解析(前端)

登录代码 1、登录之后做了什么&#xff1f; 执行登陆方法&#xff0c;成功之后&#xff0c;路由跳转到指定路径或者根目录 2、this.$store.dispatch是什么意思&#xff1f; this.$store.dispatch(‘Login’, this.loginForm) 来调取store里的user.js的login方法3、this.$r…

调试软件iic协议心得

如何判断发送成功&#xff1f; 主控发送了一个字节8位&#xff08;8个 SCL 时钟&#xff09;的数据后&#xff0c;在第9个时钟周期&#xff0c;释放 SDA 控制权&#xff08;IO 引脚输出改为输入&#xff09;&#xff0c;读取 SDA 状态&#xff0c;读到低电平表示通信成功&…

聊聊路径规划算法(四)——滚动在线RRT算法和BUG算法

基本RRT算法更偏向于遍历所有自由空间直到获取可行路由性&#xff0c;这使得它不能够进行未知或动态环境条件中的机器人实时运动计划。利用滚动计划的思路可以将RRT算法加以完善&#xff0c;使之更具有实时规划能力。 滚动规划 机器人在不确定的或动态周围环境中行走时&#x…

面试题集中营—GC日志简析及频繁GC的调优

如何查看GC日志 有两种方式查看GC日志&#xff0c;一种是动态命令行查看 jstat -gc <pid> 300 5 第二种就是在JVM参数中增加打印的参数&#xff0c;如下&#xff1a; -XX:PrintGCDetails -XX:PrintGCTimeStamps 表示打印每次GC的日志以及GC发生的时间 -Xloggc:gc.log …

LeetCode:203.移除链表元素

&#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.实现代码&#xff1a; typedef struct ListNode ListNode; struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL)return head;ListNode *NewHead,*NewTail;ListNode *pcurhead;NewHeadNewTail…

电动机保护器在电力系统中的重要性

摘要&#xff1a;在工业自动化领域&#xff0c;低压电动机广泛应用于各种机械设备&#xff0c;例如传动系统、生产线和泵。为了保证这些设备的正常运行&#xff0c;对低压电动机进行必要的保护至关重要。本文将详细介绍低压电动机的七种保护方式&#xff0c;包括过载保护、短路…

spring security登录认证授权

spring security登录认证授权 是什么 Spring Security 主要实现了Authentication&#xff08;认证&#xff0c;解决who are you? &#xff09; 和 Access Control&#xff08;访问控制&#xff0c;也就是what are you allowed to do&#xff1f;&#xff0c;也称为Authorizat…

基于ssm汽车租赁系统业务管理子系统论文

系统简介 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了汽车租赁系统业务管理子系统的开发全过程。通过分析企业对于汽车租赁系统业务管理子系统的需求&#xff0c;创建了一个计算机管理汽车租赁系统业务管理子系统的方案。文章介…

【MySQL 数据宝典】【内存结构】- 005 Log Buffer

Log Buffer Log Buffer&#xff1a;日志缓冲区&#xff0c;用来保存要写入磁盘上log文件&#xff08;Redo/Undo&#xff09;的数据&#xff0c;日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘&#xff0c;当遇到BLOB或多行更新的大事务操作时&…

【智能排班系统】Quartz结合Cron-Utils自定义时间发送上班、休息提醒

文章目录 Quartz&#xff1a;强大的Java作业调度引擎Quartz概述核心概念与架构配置文件主配置&#xff08;配置主要调度器设置、事务&#xff09;线程池配置&#xff08;调整作业执行资源&#xff09;SimpleThreadPool特定属性自定义线程池 RAMJobStore配置&#xff08;在内存中…