当前位置:   article > 正文

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

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

一、开通阿里云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、导入依赖

  1. <dependency>
  2. <groupId>com.aliyun.oss</groupId>
  3. <artifactId>aliyun-sdk-oss</artifactId>
  4. <version>3.10.2</version>
  5. </dependency>
  6. <!--lombok-->
  7. <dependency>
  8. <groupId>org.projectlombok</groupId>
  9. <artifactId>lombok</artifactId>
  10. <optional>true</optional>
  11. </dependency>
  12. <!--hutool-->
  13. <dependency>
  14. <groupId>cn.hutool</groupId>
  15. <artifactId>hutool-all</artifactId>
  16. <version>选择你的版本</version>
  17. </dependency>

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

  1. import com.aliyun.oss.ClientException;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import com.aliyun.oss.OSSException;
  5. import lombok.AllArgsConstructor;
  6. import lombok.Data;
  7. import lombok.extern.slf4j.Slf4j;
  8. import java.io.ByteArrayInputStream;
  9. @Data
  10. @AllArgsConstructor
  11. //固定代码,CV直接使用
  12. public class AliOssUtil {
  13. private String endpoint;
  14. private String accessKeyId;
  15. private String accessKeySecret;
  16. private String bucketName;
  17. /**
  18. * 文件上传
  19. *
  20. * @param bytes :传入的文件要转为byte[]
  21. * @param objectName :表示在oss中存储的文件名字。
  22. * @return
  23. */
  24. public String upload(byte[] bytes, String objectName) {
  25. // 创建OSSClient实例。
  26. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  27. try {
  28. // 创建PutObject请求。
  29. ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
  30. } catch (OSSException oe) {
  31. System.out.println("Caught an OSSException, which means your request made it to OSS, "
  32. + "but was rejected with an error response for some reason.");
  33. System.out.println("Error Message:" + oe.getErrorMessage());
  34. System.out.println("Error Code:" + oe.getErrorCode());
  35. System.out.println("Request ID:" + oe.getRequestId());
  36. System.out.println("Host ID:" + oe.getHostId());
  37. } catch (ClientException ce) {
  38. System.out.println("Caught an ClientException, which means the client encountered "
  39. + "a serious internal problem while trying to communicate with OSS, "
  40. + "such as not being able to access the network.");
  41. System.out.println("Error Message:" + ce.getMessage());
  42. } finally {
  43. if (ossClient != null) {
  44. ossClient.shutdown();
  45. }
  46. }
  47. //文件访问路径规则 https://BucketName.Endpoint/ObjectName
  48. StringBuilder stringBuilder = new StringBuilder("https://");
  49. stringBuilder
  50. .append(bucketName)
  51. .append(".")
  52. .append(endpoint)
  53. .append("/")
  54. .append(objectName);
  55. return stringBuilder.toString();
  56. }
  57. }

3、配置阿里云OSS

  1. aliyun.oss.bucketName = scl-oss-test
  2. aliyun.oss.endpoint = oss-cn-beijing.aliyuncs.com
  3. aliyun.oss.accessKeyId =
  4. aliyun.oss.accessKeySecret =

4、配置相应model类

  1. import lombok.Data;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. @ConfigurationProperties(prefix = "aliyun.oss")
  6. @Data
  7. public class AliOssProperties {
  8. private String endpoint;
  9. private String accessKeyId;
  10. private String accessKeySecret;
  11. private String bucketName;
  12. }

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

  1. import com.fpl.model.AliOssProperties;
  2. import com.fpl.utils.AliOssUtil;
  3. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class OssConfiguration {
  8. @Bean
  9. @ConditionalOnMissingBean
  10. public AliOssUtil getAliOssUtil(AliOssProperties aliOssProperties) {
  11. // log.info("创建OssUtil");
  12. AliOssUtil aliOssUtil = new AliOssUtil(
  13. aliOssProperties.getEndpoint(),
  14. aliOssProperties.getAccessKeyId(),
  15. aliOssProperties.getAccessKeySecret(),
  16. aliOssProperties.getBucketName()
  17. );
  18. return aliOssUtil;
  19. }
  20. }

五、结合上传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上传到阿里云

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

  1. package com.by.controller;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.http.HttpUtil;
  4. import com.by.util.AliOssUtil;
  5. import com.itextpdf.forms.PdfAcroForm;
  6. import com.itextpdf.forms.fields.PdfFormField;
  7. import com.itextpdf.kernel.font.PdfFont;
  8. import com.itextpdf.kernel.font.PdfFontFactory;
  9. import com.itextpdf.kernel.geom.PageSize;
  10. import com.itextpdf.kernel.pdf.PdfDocument;
  11. import com.itextpdf.kernel.pdf.PdfReader;
  12. import com.itextpdf.kernel.pdf.PdfWriter;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.http.HttpHeaders;
  15. import org.springframework.http.HttpStatus;
  16. import org.springframework.http.MediaType;
  17. import org.springframework.http.ResponseEntity;
  18. import org.springframework.util.ResourceUtils;
  19. import org.springframework.web.bind.annotation.GetMapping;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.io.ByteArrayOutputStream;
  23. import java.io.File;
  24. import java.io.FileInputStream;
  25. import java.io.IOException;
  26. import java.util.HashMap;
  27. import java.util.Map;
  28. import java.util.Optional;
  29. /**
  30. * 控制器类,用于处理PDF模板填充及下载请求
  31. */
  32. @RestController
  33. public class PdfController {
  34. @Autowired
  35. private AliOssUtil aliOssUtil;
  36. /**
  37. * 处理GET请求以下载填充了数据的PDF文件
  38. *
  39. * @param response HttpServletResponse对象,用于设置响应头和发送下载文件
  40. * @return 响应实体,包含填充好数据的PDF字节流
  41. * @throws IOException 如果读取或写入PDF文件时发生异常
  42. */
  43. @GetMapping("/download")
  44. public ResponseEntity<byte[]> test(HttpServletResponse response) throws IOException {
  45. // 设置响应头,指示浏览器以附件形式下载文件,并设置文件名
  46. HttpHeaders headers = new HttpHeaders();
  47. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  48. String downloadFileName = System.currentTimeMillis() + ".pdf";
  49. response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
  50. // 准备需要填充到PDF模板中的数据
  51. Map<String, String> dataMap = new HashMap<>();
  52. dataMap.put("name", "可口可乐");
  53. dataMap.put("code", "350ml");
  54. // 填充数据并生成带数据的PDF字节流
  55. byte[] pdfBytes = getPdf(dataMap);
  56. //上传到oss
  57. aliOssUtil.upload(pdfBytes, downloadFileName);
  58. // 创建并返回包含填充后PDF字节流的响应实体
  59. return new ResponseEntity<>(pdfBytes, headers, HttpStatus.CREATED);
  60. }
  61. /**
  62. * 根据提供的数据填充PDF模板并返回填充后的PDF字节流
  63. *
  64. * @param dataMap 需要填充到PDF模板中的键值对数据
  65. * @return 填充好数据的PDF文件字节数组
  66. * @throws IOException 如果读取或写入PDF文件时发生异常
  67. */
  68. private byte[] getPdf(Map<String, String> dataMap) throws IOException {
  69. //获取阿里云OSS上传的pdf模板
  70. String fileUrl = "https://scl-oss-test.oss-cn-beijing.aliyuncs.com/1.pdf";
  71. //将文件下载后保存在E盘,返回结果为下载文件大小
  72. long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("C:/Users/admin/Desktop"));
  73. // 获取PDF模板文件路径
  74. File sourcePdf = ResourceUtils.getFile("C:/Users/admin/Desktop/1.pdf");
  75. // 使用PDF阅读器加载模板文件
  76. PdfReader pdfReader = new PdfReader(new FileInputStream(sourcePdf));
  77. // 创建一个内存输出流用于存储填充好数据的PDF文件
  78. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  79. // 创建PDF文档对象,连接读取器和输出流
  80. PdfDocument pdf = new PdfDocument(pdfReader, new PdfWriter(outputStream));
  81. // 设置默认页面大小为A4
  82. pdf.setDefaultPageSize(PageSize.A4);
  83. // 获取PDF表单域对象
  84. PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
  85. Map<String, PdfFormField> fields = form.getFormFields();
  86. // 设置字体,这里使用的是"STSong-Light"字体
  87. PdfFont currentFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", PdfFontFactory.EmbeddingStrategy.PREFER_NOT_EMBEDDED);
  88. // 遍历待填充的数据,并将其填入对应的表单域
  89. dataMap.forEach((key, value) -> {
  90. Optional<PdfFormField> formFieldOptional = Optional.ofNullable(fields.get(key));
  91. formFieldOptional.ifPresent(formField -> {
  92. // 设置字体并替换表单域的值
  93. formField.setFont(currentFont).setValue(value);
  94. });
  95. });
  96. // 锁定并合并所有表单域,使其无法再编辑
  97. form.flattenFields();
  98. // 关闭PDF文档,释放资源
  99. pdf.close();
  100. // 将填充好的PDF文件转换为字节数组并返回
  101. return outputStream.toByteArray();
  102. }
  103. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/479631
推荐阅读
相关标签
  

闽ICP备14008679号