示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文基于 aws-doc-sdk-examples 仓库中的 AWS Photo Analyzer 教程完整讲解如何用 JavaSpring Boot AWS SDK for Java V2构建一个动态 Web 应用将自然风景图片上传至 Amazon S3通过 Amazon Rekognition 自动识别图片中的标签如湖泊、山峰、森林最后用 Amazon SES 将包含每个图片标签明细的 Excel 报表发送到指定邮箱。读完本文你将掌握 Spring Boot MVC Thymeleaf 与 S3、Rekognition、SES 三个 AWS 服务集成的一套可复现、可扩展的工程范式。应用概览一个“上传—识别—出报告”的完整闭环AWS Photo Analyzer 是一个面向初中级开发者的示例应用核心业务流如下通过浏览器把自然风景图片上传到指定的 Amazon S3 存储桶上传完成后页面列出桶中所有对象名称、属主、修改时间、大小输入邮箱地址并点击Analyze Photos应用遍历桶内每张图片调用 Amazon Rekognition 的DetectLabels识别出每张图片的标签及置信度用 JXL 库把识别结果动态生成 Excel 工作簿每个图片一个 Sheet通过 Amazon SES 把 Excel 报表作为附件发送到指定邮箱同时页面还支持把桶内图片直接下载到浏览器。整个应用涉及三个 AWS 服务分工明确AWS 服务在本应用中的职责Amazon S3存储上传的图片提供对象列表、读取对象字节流、写入对象Amazon Rekognition对图片字节流执行标签检测DetectLabels返回标签名与置信度Amazon SES通过SendRawEmail发送带 Excel 附件的原始 MIME 邮件从仓库源码结构看业务层被拆分为职责单一、以Component注册的组件S3Service.javaS3 操作、AnalyzePhotos.javaRekognition 分析、WriteExcel.java报表生成、SendMessages.java邮件发送再由 PhotoController.java 统一编排 HTTP 请求形成清晰的 MVC 分层。环境准备Prerequisites动手前需要准备以下环境一个 AWS 账户本教程涉及的三个服务均包含在 AWS Free Tier 中Java IDE教程以 IntelliJ IDEA 为例Java JDK 17Maven 3.6 及以上。需要提前注意的事项该示例代码未经所有 AWS 区域的验证部分服务只在特定区域可用请以 AWS Regional Services 为准运行示例代码可能产生 AWS 费用请务必在教程结束后终止/清理创建的桶等资源以免持续计费需要提前创建名为photos[somevalue]如photos12345的 S3 桶并把桶名填入 Java 代码需要按 Setting up the AWS SDK for Java 2.x 配置好开发环境与凭证本应用使用EnvironmentVariableCredentialsProvider即通过环境变量注入 AWS 凭证。应用使用流程应用启动后支持三类操作界面效果对应仓库 images 目录 中的截图上传图片在 Upload Photos 页面选择本地图片提交图片即被写入 S3 桶点击Get Images可刷新表格查看桶内所有图片的名称、属主、日期与大小见 upload3.png生成报告在 Analyze Photos 页面输入邮箱并点击Analyze Photos前端显示“Generating Report”进度条后台完成全桶图片分析并通过 SES 发送报表见 Report2.png下载图片输入图片名称并点击Download Photo图片作为image/png附件下载到浏览器见 download.png。创建 IntelliJ Maven 项目在 IntelliJ 中选择File → New → Project在New Project对话框选择Maven点击NextGroupId填写aws-springArtifactId填写SpringPhotoAnalyzer点击Next → Finish。随后在src/main/java下创建包com.example.photo本应用的全部 8 个 Java 类都位于该包中仓库中的实际文件可参见 src/main/java/com/example/photo。配置 pom.xml 依赖仓库中提供了可直接对照的 pom.xml关键配置如下父工程使用spring-boot-starter-parent2.6.1并显式锁定Java 17java.version/maven.compiler.source/target均为 17通过software.amazon.awssdk:bom2.21.20 统一管理 AWS SDK 版本dependencyManagement引入 BOM依赖无需写版本号核心依赖清单依赖用途spring-boot-starter-thymeleafThymeleaf 模板引擎渲染 index/process/upload 视图spring-boot-starter-webSpring MVC、内嵌 Tomcat、Multipart 上传支持software.amazon.awssdk:s3Amazon S3 客户端software.amazon.awssdk:rekognitionAmazon Rekognition 客户端software.amazon.awssdk:sesAmazon SES 客户端net.sourceforge.jexcelapi:jxl2.6.12JXL 库动态生成 Excel 报表非 AWS APIjavax.mail:javax.mail-api/com.sun.mail:javax.mail1.6.2构建带附件的 MIME 邮件commons-io2.7字节流转换与拷贝工具构建插件使用spring-boot-maven-plugin可直接打包运行。注意 JXLjxl用于生成.xls工作簿与 AWS 无直接关系是本教程唯一的第三方报表库。编写 Java 类核心源码解析以下按职责逐个讲解 8 个 Java 类源码均可在仓库com.example.photo包中对照阅读。PhotoApplicationSpring Boot 启动入口package com.example.photo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class PhotoApplication { public static void main(String[] args) { SpringApplication.run(PhotoApplication.class, args); } }SpringBootApplication启用自动配置与组件扫描com.example.photo包下所有ComponentS3Service、AnalyzePhotos、WriteExcel、SendMessages和ControllerPhotoController都会被自动注册。AnalyzePhotosAmazon Rekognition 标签检测该类是整条分析链路的起点调用 Rekognition 的detectLabels识别图片内容package com.example.photo; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.rekognition.RekognitionClient; import software.amazon.awssdk.services.rekognition.model.Image; import software.amazon.awssdk.services.rekognition.model.DetectLabelsRequest; import software.amazon.awssdk.services.rekognition.model.DetectLabelsResponse; import software.amazon.awssdk.services.rekognition.model.Label; import software.amazon.awssdk.services.rekognition.model.RekognitionException; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; Component public class AnalyzePhotos { public ArrayListWorkItem DetectLabels(byte[] bytes, String key) { try { RekognitionClient rekClient RekognitionClient.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(Region.US_EAST_2) .build(); SdkBytes sourceBytes SdkBytes.fromByteArray(bytes); Image souImage Image.builder() .bytes(sourceBytes) .build(); DetectLabelsRequest detectLabelsRequest DetectLabelsRequest.builder() .image(souImage) .maxLabels(10) .build(); DetectLabelsResponse labelsResponse rekClient.detectLabels(detectLabelsRequest); ListLabel labels labelsResponse.labels(); System.out.println(Detected labels for the given photo); ArrayListWorkItem list new ArrayList(); WorkItem item; for (Label label : labels) { item new WorkItem(); item.setKey(key); // identifies the photo item.setConfidence(label.confidence().toString()); item.setName(label.name()); list.add(item); } return list; } catch (RekognitionException e) { System.out.println(e.getMessage()); System.exit(1); } return null; } }关键实现要点图片以字节数组构造SdkBytes再封装为Image传入请求无需先把图片传到 Rekognition 的 S3 引用maxLabels(10)限制单张图片最多返回 10 个标签降低分析耗时与成本每个标签封装为一个WorkItem其中key记录图片在桶中的对象键用于后续报表中“哪张图有哪些标签”的对应关系凭证使用EnvironmentVariableCredentialsProvider通过环境变量注入密钥区域固定为US_EAST_2注意源码与 README 中System.exit(1)的异常处理方式示例为演示简洁直接退出生产环境建议改为抛出或记录日志后继续执行。模型类BucketItem 与 WorkItemBucketItem存储 S3 对象元数据key / owner / date / sizeWorkItem存储 Rekognition 分析结果key / name / confidence二者都是简单的 POJOgetter/setter分别作为“S3 对象列表”与“图片标签结果”在控制器与视图/报表之间传递的数据载体完整代码见 BucketItem.java 与 WorkItem.java。S3ServiceAmazon S3 操作封装S3Service以Component注册集中封装全部 S3 操作区域US_WEST_2完整实现见 S3Service.java核心方法包括getObjectBytes(bucketName, keyName)通过s3.getObjectAsBytes把对象整体读入内存并返回byte[]供 Rekognition 分析与下载功能复用ListAllObjects(bucketName)s3.listObjects列出桶内对象将 key、owner、sizeKB 为单位、lastModified 填充到BucketItem最终序列化为 XML 字符串返回给前端ListBucketObjects(bucketName)仅返回对象键key的ArrayListString供报告生成流程遍历putObject(byte[] data, bucketName, objectKey)用RequestBody.fromBytes把上传文件字节写入桶。其中列表结果之所以生成 XML是为了与前端 DataTables 配合toXml使用 DOM 解析器构建ItemsItemKey…Owner…Date…Size…/Item/Items结构再经Transformer转为字符串。值得关注的是安全细节——toXml中调用了factory.setFeature(http://apache.org/xml/features/disallow-doctype-decl, true)convertToString也启用了XMLConstants.FEATURE_SECURE_PROCESSING用于防御 XXE 等 XML 注入风险。SendMessagesAmazon SES 发送带附件的邮件SendMessages构建标准 MIME 邮件并通过 SES 的sendRawEmail发送区域US_WEST_2完整实现见 SendMessages.java。其核心流程public void sendReport(InputStream is, String emailAddress) throws IOException { byte[] fileContent IOUtils.toByteArray(is); try { send(fileContent, emailAddress); } catch (MessagingException e) { e.printStackTrace(); } }send方法内部用javax.mail构建MimeMessage主题为Analyzed photos report发件人、收件人分别设置采用multipart/alternative结构同时提供纯文本与 HTML 两种邮件正文照顾不支持 HTML 的客户端再以multipart/mixed作为父容器挂上正文与附件附件通过ByteArrayDataSource绑定 Excel 字节流MIME 类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet附件名为PhotoReport.xls把整个MimeMessage写入ByteArrayOutputStream转成SdkBytes后构造RawMessage调用SesClient.sendRawEmail完成发送。务必注意源码中的发件人地址sender需要替换为你自己的、已在 Amazon SES 完成身份验证verify的邮箱地址否则发送会被拒绝关于创建和验证身份的官方说明参见 Creating and verifying identities in Amazon SES。WriteExcel用 JXL 动态生成 Excel 报表WriteExcel使用 JXLJava Excel API把ListListWorkItem外层列表对应桶内每张图片内层是该图片的标签结果渲染成工作簿完整实现见 WriteExcel.javaexportExcel(ListListWorkItem)是入口返回InputStream供邮件附件与下载使用write方法为每组WorkItem创建一个名为Sheet N的工作表最终workbook.write(); workbook.close();后把字节流转成ByteArrayInputStream返回每个 Sheet 的表头为Photo / Label / Confidence三列数据行依次写入WorkItem的 key图片键、标签名和置信度通过WritableFont设置 Times 字体、加粗下划线表头、自动换行与按内容宽度自适应列宽保证报表可直接阅读。PhotoControllerSpring MVC 控制器编排全流程PhotoController是应用的“大脑”负责把前端请求路由到上述组件完整实现见 PhotoController.java。第一步必须把bucketName字段替换成你的 S3 桶名private final String bucketName Enter your S3 bucket name;通过构造器注入四个组件s3Service、photos、excel、sendMessage控制器暴露以下端点HTTP 端点方法作用GET /root()返回index首页视图GET /processprocess()返回process报告视图GET /photophoto()返回upload上传视图GET /getimagesgetImages()调用s3Service.ListAllObjects返回对象列表 XMLPOST /reportreport()生成并发送分析报表核心流程POST /uploadsingleFileUpload(MultipartFile file)接收上传文件并写入 S3成功后重定向回photoGET /downloadphotobuildDynamicReportDownload()按photoKey读取图片字节以附件方式流式写回浏览器report方法是整条管线的编排点展示了多服务协作的真实调用链String email request.getParameter(email); ArrayListString myKeys s3Service.ListBucketObjects(bucketName); ArrayListListWorkItem myList new ArrayList(); for (String myKey : myKeys) { byte[] keyData s3Service.getObjectBytes(bucketName, myKey); ArrayListWorkItem item photos.DetectLabels(keyData, myKey); myList.add(item); } InputStream excelData excel.exportExcel(myList); sendMessage.sendReport(excelData, email); return The photos have been analyzed and the report is sent;下载端点则演示了“内存字节流直接响应”的写法设置Content-type: image/png与Content-disposition: attachment; filenamephotoKey后用IOUtils.copy把图片字节写回response.getOutputStream()。创建 HTML 视图Thymeleaf 模板在src/main/resources下创建templates目录包含 4 个 HTML 文件index.html首页、process.html生成报告页、upload.html上传页、layout.html全局菜单。index.html应用首页通过header th:replacelayout :: site-header/复用导航用有序列表说明完整操作步骤上传 → 查看图片 → 生成报告 → SES 发送邮件process.html包含邮箱输入框idemail、Analyze Photos按钮触发ProcessImages()、带Generating Report文字的进度条idbar以及下载图片区域输入photo名称、点击DownloadImage()upload.html提供POST /upload的multipart/form-data表单上传文件下方是 DataTables 表格idmyTable表头为 Name / Owner / Date / Size由getImages()通过 AJAX 填充数据layout.html以 Thymeleaf fragmentth:fragmentsite-header定义 Home / Upload Photos / Analyze Photos 三个菜单链接th:href{/}、{/photo}、{/process}供所有视图复用。创建前端脚本items.js 与 message.jsitems.js与message.js是视图与控制器之间的“通信层”缺失会导致页面按钮失效items.js初始化 DataTables 表格启用滚动、分页、固定列getImages()用$.ajax请求GET /getimages解析返回 XML 中的每个Item取出 Key / Owner / Date / Size 填充进表格message.js页面加载时隐藏进度条ProcessImages()通过$.ajax以POST提交email参数到/report过程中显示进度条成功后隐藏并弹出控制器返回的提示文本DownloadImage()读取输入框中的照片名把浏览器导航到../downloadphoto?photoKey名称。此外README 特别提醒仓库中还包含 CSS 等静态资源文件需把resources目录下的所有文件含public/css、public/js、public/images一并加入项目否则页面样式与脚本加载不全。运行与部署在 IntelliJ 中直接点击PhotoApplication主类的运行图标即可启动 Spring Boot 应用参考 runapp.png。启动后访问http://localhost:8080即可使用完整功能。该 Spring Boot 应用也可通过AWS Elastic Beanstalk部署为 Java Web 应用仓库中javav2/usecases目录还提供了同系列的多服务实战示例如首个 AWS Java Web 应用项目可供参考。清理资源与下一步教程结束时请务必终止/清理在教程中创建的所有资源尤其是 S3 桶避免持续产生费用。进一步学习可参考仓库中的 usecases 目录其中包含多个多服务集成示例。若要为示例应用增加更强的安全性如替换System.exit(1)、改用 IAM Role 凭证、接入 Web 层鉴权可从本文列出的组件源码入手扩展。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐如何快速构建首个AWS SDK for Java Spring Boot Web应用零基础入门指南如何快速构建首个AWS SDK for Java Spring Boot Web应用零基础入门指南 AWS SDK for Java是开发人员构建云原生应用的示例工程教程后端使用AWS SDK for Java V2构建异步消息发布订阅Web应用使用AWS SDK for Java V2构建异步消息发布订阅Web应用 概述 本文介绍如何使用AWS SDK for Java V2开发一个具有订阅和发布功能示例工程教程后端AWS SDK for Java v2人工智能Bedrock与Comprehend应用AWS SDK for Java v2人工智能Bedrock与Comprehend应用 概述 AWS SDK for Java v2是AWS官方提供的Java后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考