Java 11 Lambda读取S3的docx文件时获取到S3网页而非文件内容如何处理
AWS Lambda Java 11 正确读取S3存储docx文件解决方案
问题根因说明
你观察到的包含footnotes.xml、settings.xml的输出不是加密内容,也不是S3网页内容:docx格式本质是ZIP压缩包封装的多XML文件集合,直接读取原始字节流转字符串输出就会呈现这类特征。如果确认拿到的是S3网页响应,通常是错误调用了公开URL而非用SDK直接拉取对象导致的。
正确实现步骤
- 首先确保依赖配置正确,除了AWS SDK v1之外,引入docx解析工具Apache POI:
<!-- Apache POI 处理docx依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!-- AWS SDK S3 依赖,对应你使用的1.11.937版本 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.937</version> </dependency>
- 第二步:编写正确的S3对象读取+docx解析逻辑,使用AWS SDK直接调用getObject接口获取对象流,不要手动拼接S3公开URL请求:
import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.S3Object; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import java.io.InputStream; public class S3DocxReader { private final AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); public String readDocxFromS3(String bucketName, String key) { try (S3Object s3Object = s3Client.getObject(bucketName, key); InputStream inputStream = s3Object.getObjectContent(); XWPFDocument document = new XWPFDocument(inputStream); XWPFWordExtractor extractor = new XWPFWordExtractor(document)) { // 提取docx纯文本内容 return extractor.getText(); } catch (Exception e) { // 自定义异常处理逻辑 throw new RuntimeException("读取docx文件失败", e); } } }
常见配置校验项
- 确认Lambda执行角色已配置目标S3桶的
s3:GetObject权限,桶策略未拦截Lambda执行角色的访问请求 - Lambda内存配置不低于512MB,避免Apache POI解析大文件时触发OOM
- 不要使用HTTP客户端直接请求S3对象URL,否则桶未公开时会拿到403错误页面内容,和你描述的异常输出特征一致
内容的提问来源于stack exchange,提问作者Manasi Bhatkhande
相关产品推荐
相关产品推荐

