【问题标题】:GridFs java mongo driver throws Cast exception when openning download streamGridFs java mongo驱动在打开下载流时抛出Cast异常
【发布时间】:2021-03-22 11:00:32
【问题描述】:

Mongo Java 驱动程序:3.6.0。 Java:1.8

我有一个保存在 GridFs 中的文件,当我尝试按照 MongoDb 文档所述打开下载流时,我收到一个转换异常。

打开下载流

ObjectId fileId; //The id of a file uploaded to GridFS, initialize to valid file id
GridFSDownloadStream downloadStream = gridFSBucket.openDownloadStream(fileId);
int fileLength = (int) downloadStream.getGridFSFile().getLength();
byte[] bytesToWriteTo = new byte[fileLength];
downloadStream.read(bytesToWriteTo); // >>>>>> Line failing
downloadStream.close();

Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
    at org.bson.Document.getInteger(Document.java:170) ~[bson-3.6.0.jar:na]
    at com.mongodb.client.gridfs.GridFSDownloadStreamImpl.getChunk(GridFSDownloadStreamImpl.java:221) ~[mongodb-driver-3.6.0.jar:na]
    at com.mongodb.client.gridfs.GridFSDownloadStreamImpl.getBuffer(GridFSDownloadStreamImpl.java:275) ~[mongodb-driver-3.6.0.jar:na]
    at com.mongodb.client.gridfs.GridFSDownloadStreamImpl.read(GridFSDownloadStreamImpl.java:100) ~[mongodb-driver-3.6.0.jar:na]
    at com.mongodb.client.gridfs.GridFSDownloadStreamImpl.read(GridFSDownloadStreamImpl.java:90) ~[mongodb-driver-3.6.0.jar:na]
    at com.xxx.proyect.service.conf.service.PdfService.getPdf(PdfService.java:63) ~[module-pdfs-1.8.0-SNAPSHOT.jar:na]
    ... 83 common frames omitted

【问题讨论】:

  • 您可以尝试使用更新的驱动程序(您可以尝试查询 - 查找有关存储文件的信息并查看它是否有效)。 MongoDB服务器版本是多少?
  • 我不能使用较新的版本,但它应该在 3.6.0 中工作,因为我正在关注 mongo 3.6 java 驱动程序示例。服务器是 3.6.10

标签: java mongodb classcastexception gridfs


【解决方案1】:

看起来问题是上传和下载文件的版本不同。 我将带有 NoSQLBooter 的文件上传到 Grid Bucket,并尝试使用 mongo java 驱动程序 3.6.0 通过 sw 下载它。似乎 NoSQLBooster 以与驱动程序不同的方式保存某些字段,因此驱动程序无法打开它。

我的解决方案:我实现了一种上传文件的方法,以便上传和下载相同的驱动程序并且它有效!!!

 public InsertPdfResponse addPdf(String userCode, 
                                String filename,
                                MultipartFile file){
    byte[] bytesToWriteTo;
    GridFSUploadStream uploadStream = null;
    try {
        GridFSUploadOptions options = new GridFSUploadOptions()
                .chunkSizeBytes(358400)
                .metadata(new Document("author", userCode));

        uploadStream = gridFSBucket.openUploadStream(filename, options);
        byte[] data = file.getBytes();
        uploadStream.write(data);
        uploadStream.close();

    return InsertPdfResponse.builder().inserted(true).build();
}

在此解决方案之后,我在下载文件时遇到了一些问题。文件已下载,但只有 pdf 中的第一页是正确的,其他页是空白的。我读它是因为我读字节的方式所以我稍微改变了下载服务方法。

public byte[] getPdf(String userCode, String filename) {
    byte[] bytesToWriteTo;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    gridFSBucket.downloadToStream(filename, bos);

    return bos.toByteArray();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多