반응형
C#이 있는 MongoDB GridFs, 이미지 등의 파일을 저장하는 방법
mongodb를 백엔드로 웹 앱을 개발하고 있습니다.링크인 프로필 사진처럼 프로필에 사진을 업로드하고 싶습니다.MVC2와 함께 aspx 페이지를 사용하고 있는데 GridFs 라이브러리가 대용량 파일 형식을 바이너리로 저장하는 데 사용된다고 읽었습니다.이 방법에 대한 단서를 찾기 위해 모든 곳을 찾아봤지만, mongodb에는 C#api 또는 GridFs C#에 대한 문서가 없습니다.난 당황스럽고 혼란스러워서 다른 두뇌가 필요할 것 같아
사용자가 업로드한 이미지를 mongodb 컬렉션에 저장하는 파일 업로드 컨트롤러를 실제로 구현하는 방법을 아는 사람이 있습니까?대단히 감사합니다!
나는 이것의 변형을 시도해 보았지만 소용이 없었다.
Database db = mongo.getDB("Blog");
GridFile file = new GridFile(db);
file.Create("image.jpg");
var images = db.GetCollection("images");
images.Insert(file.ToDocument());
다음 예시는 파일을 저장하고 gridfs에서 다시 읽는 방법을 보여 줍니다(공식 mongodb 드라이버를 사용).
var server = MongoServer.Create("mongodb://localhost:27020");
var database = server.GetDatabase("tesdb");
var fileName = "D:\\Untitled.png";
var newFileName = "D:\\new_Untitled.png";
using (var fs = new FileStream(fileName, FileMode.Open))
{
var gridFsInfo = database.GridFS.Upload(fs, fileName);
var fileId = gridFsInfo.Id;
ObjectId oid= new ObjectId(fileId);
var file = database.GridFS.FindOne(Query.EQ("_id", oid));
using (var stream = file.OpenRead())
{
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, (int)stream.Length);
using(var newFs = new FileStream(newFileName, FileMode.Create))
{
newFs.Write(bytes, 0, bytes.Length);
}
}
}
결과:
파일:
청크 컬렉션:
이게 도움이 됐으면 좋겠다.
2.1 RC-0 드라이버가 출시되었기 때문에 위의 답변은 곧 구식이 될 것입니다.
GridFS를 사용하는 v2.1 MongoDB의 파일을 사용하는 방법은 다음과 같습니다.
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
using System.IO;
using System.Threading.Tasks;
namespace MongoGridFSTest
{
class Program
{
static void Main(string[] args)
{
var client = new MongoClient("mongodb://localhost");
var database = client.GetDatabase("TestDB");
var fs = new GridFSBucket(database);
var id = UploadFile(fs);
DownloadFile(fs, id);
}
private static ObjectId UploadFile(GridFSBucket fs)
{
using (var s = File.OpenRead(@"c:\temp\test.txt"))
{
var t = Task.Run<ObjectId>(() => { return
fs.UploadFromStreamAsync("test.txt", s);
});
return t.Result;
}
}
private static void DownloadFile(GridFSBucket fs, ObjectId id)
{
//This works
var t = fs.DownloadAsBytesByNameAsync("test.txt");
Task.WaitAll(t);
var bytes = t.Result;
//This blows chunks (I think it's a driver bug, I'm using 2.1 RC-0)
var x = fs.DownloadAsBytesAsync(id);
Task.WaitAll(x);
}
}
}
이는 C# 드라이버 테스트의 차이에서 가져온 것입니다.
이 예에서는 문서를 객체에 연결할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using MongoDB.Bson;
using MongoDB.Driver.Builders;
using MongoDB.Driver.GridFS;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MongoServer ms = MongoServer.Create();
string _dbName = "docs";
MongoDatabase md = ms.GetDatabase(_dbName);
if (!md.CollectionExists(_dbName))
{
md.CreateCollection(_dbName);
}
MongoCollection<Doc> _documents = md.GetCollection<Doc>(_dbName);
_documents.RemoveAll();
//add file to GridFS
MongoGridFS gfs = new MongoGridFS(md);
MongoGridFSFileInfo gfsi = gfs.Upload(@"c:\mongodb.rtf");
_documents.Insert(new Doc()
{
DocId = gfsi.Id.AsObjectId,
DocName = @"c:\foo.rtf"
}
);
foreach (Doc item in _documents.FindAll())
{
ObjectId _documentid = new ObjectId(item.DocId.ToString());
MongoGridFSFileInfo _fileInfo = md.GridFS.FindOne(Query.EQ("_id", _documentid));
gfs.Download(item.DocName, _fileInfo);
Console.WriteLine("Downloaded {0}", item.DocName);
Console.WriteLine("DocName {0} dowloaded", item.DocName);
}
Console.ReadKey();
}
}
class Doc
{
public ObjectId Id { get; set; }
public string DocName { get; set; }
public ObjectId DocId { get; set; }
}
언급URL : https://stackoverflow.com/questions/4988436/mongodb-gridfs-with-c-how-to-store-files-such-as-images
반응형
'programing' 카테고리의 다른 글
ng-class에서 이것은 어떤 angularjs 식 구문입니까? (0) | 2023.03.27 |
---|---|
몽구스: 인구밀집(인구밀집지) (0) | 2023.03.27 |
md-toolbar에서 요소를 오른쪽에 배치하는 방법 (0) | 2023.03.27 |
HTTP 기본 인증을 위한 순수 JavaScript 코드입니까? (0) | 2023.03.27 |
D3 - JSON 데이터 구조를 다루는 방법 (0) | 2023.03.27 |