AWS Photo Analyzer:基于 AWS SDK for Java V2 异步客户端构建 Spring Boot 照片分析 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-doc-sdk-examples仓库的javav2/usecases/creating_photo_analyzer_async示例基础上从零构建名为AWS Photo Analyzer的 Spring Boot 动态 Web 应用。该应用以 AWS SDK for Java V2 的异步客户端S3AsyncClient、RekognitionAsyncClient为核心实现照片上传、批量标签识别、Excel 报告生成与邮件发送的完整链路。读完本文你将掌握异步客户端的CompletableFutureAtomicReference编程模式、各 AWS 服务在 Spring Boot 中的装配方式以及如何运行和部署这套完整的多服务用例。应用概览与整体架构项目说明示例名称AWS Photo Analyzer异步版源码位置javav2/usecases/creating_photo_analyzer_async目标读者初中级开发者前置技能Java、Maven涉及 AWS 服务Amazon Rekognition、Amazon S3、Amazon SES关键技术AWS SDK for Java V2异步客户端、Spring Boot MVC、Thymeleaf、JXL 报表核心工作流程用户通过 Web 界面将自然风景图片上传到 Amazon S3 桶/upload接口S3AsyncClient.putObject页面通过/getimages接口读取桶内全部对象并以 XML 形式回传S3AsyncClient.listObjects用户在/process页面输入收件邮箱并点击Analyze Photos控制器/report遍历桶内每个对象读取图片字节后调用 Amazon Rekognition 的detectLabels对每张图做标签识别识别结果照片、标签、置信度交给 JXL API 生成多 Sheet 的 Excel 报告报告通过 Amazon SES 的sendRawEmail作为附件发送到指定邮箱用户还可通过/downloadphoto把桶内图片下载到浏览器。整个示例的关键设计是S3 与 Rekognition 均使用 SDK V2 的异步客户端SES 仍使用同步的SesClient。如果希望对照使用同步客户端的同主题用例可参阅仓库中姊妹项目 creating_photo_analyzer_app。前置条件与资源准备环境要求一个可用的 AWS 账户Java IDE本教程以 IntelliJ IDEA 为例Java JDK 17Maven 3.6 或更高版本。提示文中涉及的 AWS 服务均包含在 AWS Free Tier 中但并非所有服务在所有区域可用代码运行可能产生费用请在使用后及时终止相关资源以免持续计费。创建 S3 桶创建一个名为photos[somevalue]的 S3 桶例如photos2026并确保将桶名同步配置到PhotoController的bucketName字段中。同时按 AWS 官方指引完成开发环境配置使 SDK 能通过环境变量获取凭证——本示例中AnalyzePhotos与S3Service均使用EnvironmentVariableCredentialsProvider.create()源码见 AnalyzePhotos.java 与 S3Service.java。创建 IntelliJ Maven 项目在 IntelliJ 中选择File → New → Project在New Project对话框中选择Maven点击NextGroupId填写aws-springArtifactId填写SpringPhotoAnalyzerAsync点击Next与Finish完成创建。项目骨架建立后按仓库中的 pom.xml 配置依赖。POM 依赖配置详解以下是本示例使用的完整依赖清单来自仓库 pom.xml依赖作用spring-boot-starter-parent2.6.1Spring Boot 父 POM统一管理版本spring-boot-starter-thymeleaf模板引擎渲染 HTML 视图spring-boot-starter-webSpring MVC Web 能力software.amazon.awssdk:bom2.21.20AWS SDK for Java V2 依赖清单BOM统一版本software.amazon.awssdk:rekognitionAmazon Rekognition 客户端含异步software.amazon.awssdk:s3Amazon S3 客户端含异步software.amazon.awssdk:sesAmazon SES 客户端net.sourceforge.jexcelapi:jxl2.6.12JXL API生成 Excel 报告非 AWS 服务commons-io:commons-io2.7字节流/输入输出工具javax.mail:javax.mail-api、com.sun.mail:javax.mail1.6.2构建 MIME 邮件消息spring-boot-starter-test测试依赖scopetest关键配置点java.version17/java.version与maven.compiler.target/source均设为 17务必使用 Java 17 运行AWS SDK 依赖通过dependencyManagement引入bom版本 2.21.20统一管理具体服务 artifact 无需写版本号构建插件使用spring-boot-maven-plugin可直接以可执行 JAR 方式运行应用。Java 类设计与源码实现在main/java下创建包com.example.photo共 8 个类类职责AnalyzePhotos用 Rekognition 异步客户端识别图片标签BucketItem模型S3 对象信息key/owner/date/sizePhotoApplicationSpring Boot 启动入口PhotoControllerMVC 控制器处理全部 HTTP 请求SendMessages用 SES 发送带附件的邮件S3Service用 S3 异步客户端完成对象操作WorkItem模型Rekognition 标签数据key/name/confidenceWriteExcel用 JXL API 动态生成 Excel 报告核心异步模式CompletableFuture AtomicReference异步客户端 API 的特点是方法立即返回CompletableFuture结果在回调中可用。以AnalyzePhotos.DetectLabels见 AnalyzePhotos.java为例完整调用链如下RekognitionAsyncClient rekAsyncClient RekognitionAsyncClient.builder() .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .region(Region.US_EAST_2) .build(); final AtomicReferenceArrayListWorkItem reference new AtomicReference(); SdkBytes sourceBytes SdkBytes.fromByteArray(bytes); Image souImage Image.builder().bytes(sourceBytes).build(); DetectLabelsRequest detectLabelsRequest DetectLabelsRequest.builder() .image(souImage) .maxLabels(10) // 最多返回 10 个标签 .build(); CompletableFutureDetectLabelsResponse futureGet rekAsyncClient.detectLabels(detectLabelsRequest); futureGet.whenComplete((resp, err) - { if (resp ! null) { ListLabel labels resp.labels(); ArrayListWorkItem list new ArrayList(); for (Label label : labels) { WorkItem item new WorkItem(); item.setKey(key); // 标识照片 item.setConfidence(label.confidence().toString()); item.setName(label.name()); list.add(item); } reference.set(list); } else { err.printStackTrace(); } }); futureGet.join(); return reference.get();这套代码演示了三个关键知识点CompletableFuture.whenComplete注册回调通过resp对象获取服务端数据。例如resp.labels()返回ListLabel每个Label可取出标签名name()与置信度confidence()AtomicReference跨越回调传值无法直接从whenComplete回调内部return数据会引发编译错误因此用AtomicReference在回调内set结果再在回调外get取出并作为方法返回值源码中futureGet.join()保证异步任务完成后才读取引用rekAsyncClient.close()放在finally块中确保客户端在完全用完后再关闭。S3Service采用完全相同的模式实现三个方法见 S3Service.javagetObjectBytes(bucketName, keyName)构造GetObjectRequest配合AsyncResponseTransformer.toBytes()调用s3AsyncClient.getObject(...)在回调中reference.set(resp.asByteArray())得到图片字节数组ListBucketObjects(bucketName)调用s3AsyncClient.listObjects(...)遍历resp.contents()收集全部对象的 keyputObject(data, bucketName, objectKey)用AsyncRequestBody.fromBytes(data)作为请求体调用s3AsyncClient.putObject(...)完成上传。注意S3Service构造客户端时区域为Region.US_WEST_2S3Service.java#L44-L49而AnalyzePhotos使用Region.US_EAST_2AnalyzePhotos.java#L26运行时请按你实际使用的区域调整。PhotoControllerHTTP 请求与业务编排PhotoController见 PhotoController.java通过构造器注入S3Service、AnalyzePhotos、WriteExcel、SendMessages四个组件映射了 6 个端点端点与方法功能GET /→root()返回首页indexGET /process→process()返回报告生成页processGET /photo→photo()返回上传页uploadPOST /report→report()遍历桶内图片→识别标签→生成 Excel→发邮件POST /upload→singleFileUpload()接收MultipartFile写入 S3 桶GET /getimages→getImages()返回桶内对象 XMLGET /downloadphoto→buildDynamicReportDownload()下载指定照片到浏览器其中/report是核心编排方法String email request.getParameter(email); ArrayListString myKeys (ArrayListString) 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);/downloadphoto方法则通过response.setContentType(image/png)与Content-disposition: attachment; filename...响应头配合IOUtils.copy将图片字节写入输出流实现浏览器直接下载。务必修改的配置将bucketName字段替换为你的 S3 桶名PhotoController.java#L23中默认值为占位符Enter your S3 bucket name。模型类BucketItem 与 WorkItemBucketItem封装key、owner、date、size四个字段用于在/getimages视图渲染 S3 对象元数据WorkItem封装key、name、confidence三个字段key标识照片name是 Rekognition 返回的标签名confidence为置信度字符串作为 Excel 报告的数据载体。WriteExcel用 JXL 生成多 Sheet 报告WriteExcel见 WriteExcel.java使用 JXL APInet.sourceforge.jexcelapi:jxl非 AWS 服务将ListListWorkItem写成内存中的WritableWorkbook外层列表中的每个元素一张照片的标签集合对应一个名为Sheet N的工作表WriteExcel.java#L47-L54每张表表头固定为Photo / Label / Confidence三列createLabel方法使用带下划线的粗体 Times 字体并开启自动换行createContent逐行写入key、name、confidence列宽按内容字符数自动伸缩超过 200 字符时固定为 150 列宽最终workbook.write()后转为ByteArrayInputStream返回供邮件发送与浏览器展示使用。SendMessagesSES 发送带附件邮件SendMessages见 SendMessages.java使用标准 JavaMail 构建多部分 MIME 消息再通过 SESsendRawEmail发送先构建multipart/alternative子容器同时携带纯文本与 HTML 正文再包入multipart/mixed父容器附加 Excel 附件附件通过ByteArrayDataSource(attachment, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)承载文件名为PhotoReport.xlsSendMessages.java#L92-L98将MimeMessage序列化为字节后包装为SdkBytes构造RawMessage与SendRawEmailRequest调用client.sendRawEmail(...)发送注意源码中sender为Enter a validated email address占位符且 SES 发送方地址必须在 SES 控制台中完成验证。HTML 视图与脚本文件在src/main/resources下创建templates目录放置 4 个 Thymeleaf 模板仓库源码对应位置见 creating_photo_analyzer_async 目录结构文件视图角色index.html首页介绍应用与使用步骤process.html输入邮箱生成报告、下载照片upload.html上传图片、查看桶内对象表格layout.html全站共享导航菜单Home / Upload Photos / Analyze Photos三个页面均通过header th:replacelayout :: site-header/引入共享菜单并引用 Bootstrap、jQuery、DataTables 等 CDN 资源upload.html中form methodPOST action/upload enctypemultipart/form-data直连控制器的/upload端点process.html提供邮箱输入框与Analyze Photos / Download Photo两个按钮。还需要在resources下加入两个 JS 脚本否则页面无法与控制器通信items.jsgetImages()通过$.ajax(/getimages, { type: GET })拉取 XML解析每个Item节点的 Key/Owner/Date/Size用 DataTables 的fnAddData填充表格message.jsProcessImages()通过$.ajax(/report, { type: POST, data: email email })提交邮箱并显示进度条DownloadImage()跳转至/downloadphoto?photoKey...触发下载。注意仓库中resources目录还包含其他 CSS 等静态资源文件必须一并加入项目否则页面样式与交互会缺失。运行与部署在 IntelliJ 中直接运行PhotoApplication主类点击运行图标见仓库示意图 run.pngSpring Boot 应用即在本机启动随后按首页指引依次完成上传照片 → 查看图片列表 → 输入邮箱生成报告 → 查收邮件附件的完整流程。部署方面该 Spring Boot 应用可打包后部署到 AWS Elastic Beanstalk具体可参考仓库中姊妹教程 creating_first_project。后续步骤恭喜你完成了 AWS Photo Analyzer 异步版应用的构建与运行再次提醒请务必终止本教程中创建的 S3 桶等所有资源避免持续产生 AWS 费用。如需查看更多多服务用例可浏览仓库的 javav2/usecases 目录。赞分享示例工程教程后端【免费下载链接】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基于 Spring Boot 与 S3 Java SDK V2 构建 S3 视频 HTTP 流媒体 Web 应用aws doc sdk examples基于 Spring Boot 与 S3 Java SDK V2 构建 S3 视频 HTTP 流媒体 Web 应用 本文示例工程教程后端如何快速构建首个AWS SDK for Java Spring Boot Web应用零基础入门指南如何快速构建首个AWS SDK for Java Spring Boot Web应用零基础入门指南 AWS SDK for Java是开发人员构建云原生应用的示例工程教程后端aws-doc-sdk-examples 实战用 Spring Boot、DynamoDB 增强客户端与 SNS 构建第一个 AWS Java Web 应用aws doc sdk examples 实战用 Spring Boot、DynamoDB 增强客户端与 SNS 构建第一个 AWS Java Web 应用示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考