Java GridFS MongoDB 下载文件 内容不完整

参考MongoDB官方文档GridFS的部分下载文件。

ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9");
try (GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId)) {
    int fileLength = (int) downloadStream.getGridFSFile().getLength();
    byte[] bytesToWriteTo = new byte[fileLength];
    downloadStream.read(bytesToWriteTo);
    System.out.println(new String(bytesToWriteTo, StandardCharsets.UTF_8));
}

下载图片时发现图片不完整,只下载了第一个chunck。
参考stackoverflow,GridFSDownloadStreamImpl的read方法是逐chunck读取的,因此文件大小大于chunk的时候需要循环读取。修改代码,图片可以完整下载。

    public void downloadMongoFile() throws Exception {
        ObjectId fileId = new ObjectId("60345d38ebfcf47030e81cc9");
        GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId);
        int fileLength = (int) downloadStream.getGridFSFile().getLength();
        byte[] bytes = new byte[fileLength];
        OutputStream outputStream = Files.newOutputStream(Paths.get("./img.jpg"));
        int bytesRead = 0;
        while(bytesRead < fileLength) {

            int newBytesRead = downloadStream.read(bytes);
            if(newBytesRead == -1) {
                throw new Exception();
            }
            // System.out.println("off: " + bytesRead);
            outputStream.write(bytes, 0, newBytesRead);
            bytesRead += newBytesRead;
        }
        outputStream.flush();
        outputStream.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值