ASP.NET Core Web API 无法查询MongoDB GridFS中存储文件的问题
问题原因
你当前的GridFS存储使用了自定义的bucket名称videos,对应数据库中的videos.files、videos.chunks两个集合。但C#代码初始化GridFSBucket时使用了默认构造参数,默认会查找名为fs的bucket,对应fs.files、fs.chunks集合,因此查询无结果返回null,后续访问fileInfo的属性时就触发了空引用异常。
修复方案
修改GridFSBucket初始化代码,显式指定Bucket名称为videos即可,修改后的代码如下:
var client = new MongoClient("mongodb://localhost:27017"); var database = client.GetDatabase("db_gridfs"); var movieName = "The Video.mp4"; // 初始化时指定自定义Bucket名称 IGridFSBucket bucket = new GridFSBucket(database, new GridFSBucketOptions { BucketName = "videos" }); var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, movieName); using (var cursor = await bucket.FindAsync(filter)) { var fileInfo = (await cursor.ToListAsync()).FirstOrDefault(); // 建议先判空再访问属性,避免无数据时抛出异常 if (fileInfo != null) { Console.WriteLine($"{nameof(fileInfo.Id)}: {fileInfo.Id}"); Console.WriteLine($"{nameof(fileInfo.Filename)}: {fileInfo.Filename}"); Console.WriteLine($"{nameof(fileInfo.Length)}: {fileInfo.Length}"); Console.WriteLine($"{nameof(fileInfo.ChunkSizeBytes)}: {fileInfo.ChunkSizeBytes}"); Console.WriteLine($"{nameof(fileInfo.UploadDateTime)}: {fileInfo.UploadDateTime}"); } else { Console.WriteLine("未找到匹配的文件"); } }
补充说明
如果需要按文件ID查询,注意传入的ID类型需要和数据库中存储的_id类型匹配,你当前库中存储的是ObjectId类型,不要直接传入字符串ID,需要先转换为ObjectId类型再构造查询条件。
内容的提问来源于stack exchange,提问作者siles
相关产品推荐
相关产品推荐

