【问题标题】:ASP.NET Core Web API can't find file in MongoDB GridFSASP.NET Core Web API 在 MongoDB GridFS 中找不到文件
【发布时间】:2021-12-18 22:19:12
【问题描述】:

我正在处理我的一些项目,该项目将使用 MongoDB GridFS 来存储多媒体(视频、音频)文件。

该项目使用 ASP.NET Core Web API 向客户端提供数据。 问题是我从来没有得到对文件的引用。在数据库中找不到该文件,当我尝试通过 id 查找文件时也是如此。

但是当我使用 NoSQLBooster for MongoDB 并使用相同的值对 mongodb 进行查询时,我得到了我正在寻找的文件的正确结果。

MongoDB GridFS 文档中的代码也不起作用。 https://mongodb.github.io/mongo-csharp-driver/2.13/reference/gridfs/findingfiles/

var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("db_gridfs");

var movieName = "The Video.mp4";

IGridFSBucket bucket = new GridFSBucket(database);
var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, movieName);

using (var cursor = await bucket.FindAsync(filter))
{
    var fileInfo = (await cursor.ToListAsync()).FirstOrDefault();

    try
    {
        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}");
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
}

错误

System.NullReferenceException:对象引用未设置为对象的实例。

我的项目文件

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <RootNamespace>API_Test</RootNamespace>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="MongoDB.Driver" Version="2.13.2" />
      <PackageReference Include="MongoDB.Driver.GridFS" Version="2.13.2" />
    </ItemGroup>

</Project>

MongoDB 外壳

> show dbs
admin           0.000GB
config          0.000GB
db_gridfs       0.029GB
largFiles       0.022GB
local           0.000GB
myLocalMongoDB  0.000GB

> use db_gridfs
switched to db db_gridfs


> show collections
videos.chunks
videos.files


> db.videos.files.find()
{ "_id" : ObjectId("61800905290dc9ea5307ff8d"), "length" : 23870090, "chunkSize" : 261120, "uploadDate" : ISODate("2021-11-01T15:34:29.262Z"), "filename" : "The Video.mp4", "contentType" : "video/mp4" }
{ "_id" : ObjectId("6183e337718935cd919bdc0e"), "length" : 8221882, "chunkSize" : 261120, "uploadDate" : ISODate("2021-11-04T13:42:15.929Z"), "filename" : "The Video 2.mp4", "contentType" : "video/mp4" }

【问题讨论】:

    标签: mongodb asp.net-core-webapi gridfs


    【解决方案1】:

    我认为从上述问题中看不到任何东西,但我投票赞成在这些情况下您使用不同的连接字符串或数据库。您可以通过此 shell 查询检查您要查找的文件是否确实存在:

        MongoDB Enterprise replset:PRIMARY> use db_gridfs
        switched to db db_gridfs
        MongoDB Enterprise replset:PRIMARY> show collections
        fs.chunks
        fs.files
        MongoDB Enterprise replset:PRIMARY> db.fs.files.find({})
        { "_id" : ObjectId("618423b7bb151f094ea82aee"), "length" : NumberLong(3), "chunkSize" : 261120, "uploadDate" : ISODate("2021-11-04T18:17:30.905Z"), "md5" : "5289df737df57326fcdd22597afb1fac", "filename" : "test.txt" }
    

    通过您提供的修改代码插入上述文件的位置:

            var client = new MongoClient();
            var database = client.GetDatabase("db_gridfs");
    
            var movieName = "test.txt";
    
            IGridFSBucket bucket = new GridFSBucket(database);
            var filter = Builders<GridFSFileInfo>.Filter.Eq(x => x.Filename, movieName);
            // inserting
            bucket.UploadFromBytes(movieName, new byte[] { 1, 2, 3 });
    
            using (var cursor = bucket.Find(filter))
            {
                var fileInfo = (cursor.ToList()).FirstOrDefault();
    
                try
                {
                    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}");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
    

    更新: 查看您的代码,您没有指定 busket 名称,这意味着默认情况下您将在 fs.files 中搜索文件,它应该是:

     IGridFSBucket bucket = new GridFSBucket(database, new GridFSBucketOptions() { BucketName = "videos" });   
    

    【讨论】:

    • 我确实使用了 MongoDB shell、用于 MongoDB 应用程序的 NoSQLBooster,正如我之前提到的。该文件存在于数据库中,但使用 FindAsync() 函数没有给我任何结果(未找到文件/文件)。
    • 查看上面我插入文件(UploadFromBytes)然后读取(查找)它的代码。如果它不适合你,那么 99.9% 你使用不同的连接字符串或数据库
    • 尝试在一个简单的控制台应用程序中使用相同的连接字符串重现您的行为,我怀疑您会遇到任何问题
    • 另见更新
    • 我刚刚阅读了您的消息,尽管我自己最近得出的结论是,实际上问题在于在搜索集合时未在 Find()/FindAsync() 方法中提供新的 GridFSBucketOptions() 对象不是您在更新中提到的默认名称。感谢dododo的回复。
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2017-08-15
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多