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

使用Java SDK v2上传图片至Cosmos DB失败问题咨询

Cosmos DB AsyncDocumentClient上传附件返回null导致空指针问题解决

问题场景

文档创建功能正常,已成功插入本地Cosmos DB模拟器并获取文档ID,但调用createAttachment上传图片附件时,getResource()返回null,触发空指针异常。

核心排查点与修复方案

1. 修正Media的Content-Type设置

当前代码使用application/octet-stream作为ContentType,对于PNG图片,建议使用标准的image/png类型,这可能影响Cosmos DB对媒体资源的正确处理:

MediaOptions mediaOptions=new MediaOptions();
mediaOptions.setContentType("image/png"); // 替换原有的application/octet-stream

2. 校验输入流的有效性

先确认getMedia1Stream()返回的流不为空,避免上传无效流导致异常:

try(InputStream stream= getMedia1Stream()){
    if (stream == null) {
        throw new FileNotFoundException("resources目录下未找到img.png文件,请检查文件名是否匹配");
    }
    // 可选:验证流是否有内容
    if (stream.available() == 0) {
        throw new IOException("图片文件流为空,无法上传");
    }
    // 后续上传逻辑
}

3. 完善响应结果的处理逻辑

不要直接链式调用getResource(),先获取完整的ResourceResponse<Attachment>对象,检查响应状态码与返回内容:

ResourceResponse<Attachment> attachmentResponse = client.createAttachment(
        createdDocument.getSelfLink(), 
        stream, 
        mediaOptions, 
        options)
        .toBlocking().single();

// 先检查响应状态码,确认请求是否成功
System.out.println("附件上传响应状态码:" + attachmentResponse.getStatusCode());
if (attachmentResponse.getResource() != null) {
    System.out.println("attachment id:"+attachmentResponse.getResource().getId());
} else {
    // 打印响应头排查问题
    System.out.println("响应头信息:" + attachmentResponse.getResponseHeaders());
}

4. 确认分区键配置一致性

确保集合创建时指定的分区键路径为/partitionkey(与文档中的字段名一致),且RequestOptions中设置的PartitionKey值正确对应文档的分区键值。

5. 检查Cosmos DB模拟器版本

旧版本模拟器可能存在媒体资源处理的bug,建议更新至最新版本,同时查看模拟器的请求日志,获取附件上传请求的详细错误信息。

完整修正代码示例

// 文档创建逻辑不变
var createdDocument = client.createDocument(getCollectionNameLink(databaseId, collectionId), getDocumentDefinition(), null, false)
        .toBlocking().single().getResource();

RequestOptions options = new RequestOptions();
options.setPartitionKey(new PartitionKey(createdDocument.getId()));
System.out.println("document id:"+createdDocument.getId());

try(InputStream stream= getMedia1Stream()){
    if (stream == null) {
        throw new FileNotFoundException("resources目录下未找到img.png文件");
    }
    if (stream.available() == 0) {
        throw new IOException("图片流为空");
    }

    MediaOptions mediaOptions=new MediaOptions();
    mediaOptions.setContentType("image/png");

    ResourceResponse<Attachment> attachmentResponse = client.createAttachment(
            createdDocument.getSelfLink(), 
            stream, 
            mediaOptions, 
            options)
            .toBlocking().single();

    System.out.println("附件上传状态码:" + attachmentResponse.getStatusCode());
    if (attachmentResponse.getResource() != null) {
        System.out.println("attachment id:"+attachmentResponse.getResource().getId());
    } else {
        System.out.println("响应头:" + attachmentResponse.getResponseHeaders());
    }

}catch (Exception e) {
    e.printStackTrace();
}

// Helper方法保持不变
private InputStream getMedia1Stream() {
    return this.getClass().getResourceAsStream("/img.png");
}

private static Document getDocumentDefinition() {
    String uuid = UUID.randomUUID().toString();
    Document doc = new Document(String.format("{ "
                    + "\"id\": \"%s\", "
                    + "\"partitionkey\": \"%s\", "
                    + "\"sgmts\": [[6519456, 1471916863], [2498434, 1455671440]]"
                    + "}"
            , uuid, uuid));
    return doc;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:30:55