You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure CosmosDB使用Java API添加附件技术咨询

用Java API在Cosmos DB中创建附件(适配POC场景)

我来帮你梳理下从Cloudant迁移到Cosmos DB后,用Java API创建PDF附件的具体步骤,刚好适合做小型POC验证:

一、准备环境:添加Cosmos DB Java SDK依赖

首先在你的Maven项目中添加最新的Cosmos DB SQL API SDK依赖(目前推荐4.x版本):

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-cosmos</artifactId>
    <version>4.56.0</version> <!-- 请用最新稳定版 -->
</dependency>

二、初始化Cosmos客户端

先建立和Cosmos DB的连接,把占位符替换成你的实际账户信息:

import com.azure.cosmos.CosmosClient;
import com.azure.cosmos.CosmosClientBuilder;
import com.azure.cosmos.CosmosContainer;
import com.azure.cosmos.CosmosDatabase;

public class CosmosAttachmentDemo {
    private static final String ENDPOINT = "你的Cosmos DB账户端点";
    private static final String KEY = "你的Cosmos DB账户密钥";
    private static final String DATABASE_NAME = "你的数据库名称";
    private static final String CONTAINER_NAME = "你的容器名称";

    public static void main(String[] args) {
        // 初始化客户端(try-with-resources自动关闭资源)
        try (CosmosClient cosmosClient = new CosmosClientBuilder()
                .endpoint(ENDPOINT)
                .key(KEY)
                .buildClient()) {
            CosmosDatabase database = cosmosClient.getDatabase(DATABASE_NAME);
            CosmosContainer container = database.getContainer(CONTAINER_NAME);
            
            // 调用创建附件的方法
            createPdfAttachment(container);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、方式1:直接将PDF嵌入Cosmos DB文档(适合小文件)

Cosmos DB没有像Cloudant那样专门的Attachment API,但我们可以把PDF的二进制数据作为文档的一个字段存储(用Binary类型),完全满足POC需求:

import com.azure.cosmos.models.CosmosItemRequestOptions;
import com.azure.cosmos.models.CosmosItemResponse;
import com.azure.cosmos.models.PartitionKey;
import com.azure.cosmos.util.Binary;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

private static void createPdfAttachment(CosmosContainer container) throws IOException {
    // 1. 读取本地PDF文件为字节数组
    byte[] pdfBytes = Files.readAllBytes(Paths.get("./test.pdf")); // 替换成你的PDF路径
    
    // 2. 构建包含附件信息的文档
    Map<String, Object> document = new HashMap<>();
    document.put("id", "pdf-doc-" + System.currentTimeMillis()); // 生成唯一文档ID
    document.put("fileName", "test.pdf");
    document.put("fileType", "application/pdf");
    document.put("fileContent", new Binary(pdfBytes)); // 用Binary类型存储二进制数据
    
    // 3. 插入文档到Cosmos DB(替换为你的分区键值)
    CosmosItemResponse<Map> response = container.createItem(
            document,
            new PartitionKey("user-001"), // 示例分区键值,根据你的容器配置修改
            new CosmosItemRequestOptions()
    );
    
    System.out.println("文档创建成功,状态码:" + response.getStatusCode());
}

验证方式:读取并还原PDF

如果你想确认附件是否正确存储,可以写一段读取代码还原PDF:

private static void retrievePdfAttachment(CosmosContainer container, String docId, String partitionKey) throws IOException {
    CosmosItemResponse<Map> response = container.readItem(
            docId,
            new PartitionKey(partitionKey),
            Map.class
    );
    
    Map<String, Object> document = response.getItem();
    Binary binaryContent = (Binary) document.get("fileContent");
    byte[] pdfBytes = binaryContent.getBytes();
    
    // 将字节数组写入本地文件
    Files.write(Paths.get("./retrieved-test.pdf"), pdfBytes);
    System.out.println("PDF已成功还原到本地");
}

四、方式2:用Azure Blob Storage存储大PDF(最佳实践)

如果你的PDF体积较大(超过2MB,Cosmos DB单文档默认上限),推荐用Azure Blob Storage存储文件,然后在Cosmos DB文档中保存Blob的访问链接和元数据,这也是Azure的官方最佳实践:

1. 添加Blob Storage SDK依赖

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.25.0</version> <!-- 最新稳定版 -->
</dependency>

2. 上传PDF到Blob并记录链接到Cosmos

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobContainerClient;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;

private static void createPdfWithBlobLink(CosmosContainer container) throws IOException {
    // 初始化Blob客户端
    String blobConnectionString = "你的Blob Storage连接字符串";
    String blobContainerName = "pdf-storage"; // 替换为你的Blob容器名称
    BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
            .connectionString(blobConnectionString)
            .buildClient();
    BlobContainerClient blobContainerClient = blobServiceClient.getBlobContainerClient(blobContainerName);
    
    // 上传PDF到Blob
    String blobName = "test-" + System.currentTimeMillis() + ".pdf";
    BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
    blobClient.uploadFromFile("./test.pdf"); // 替换为你的PDF路径
    
    // 构建Cosmos文档,存储Blob链接和元数据
    Map<String, Object> document = new HashMap<>();
    document.put("id", "doc-with-blob-" + System.currentTimeMillis());
    document.put("fileName", "test.pdf");
    document.put("fileType", "application/pdf");
    document.put("blobUrl", blobClient.getBlobUrl()); // 存储Blob的公共访问URL(需容器允许公共访问)
    
    // 插入文档到Cosmos
    CosmosItemResponse<Map> response = container.createItem(
            document,
            new PartitionKey("user-001"), // 替换为你的分区键值
            new CosmosItemRequestOptions()
    );
    
    System.out.println("带Blob链接的文档创建成功,状态码:" + response.getStatusCode());
}

注意事项

  • 确保你的Cosmos DB容器已经提前创建,分区键选择要符合业务场景(比如用户ID、文档类型等)
  • 生产环境中不要硬编码连接字符串和密钥,建议用Azure Key Vault统一管理
  • 如果用方式1,注意单文档大小限制(默认2MB,可申请提升到10MB),超过上限必须用方式2

内容的提问来源于stack exchange,提问作者user680702

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:05