2011-12-12 3 views
1

내가 내 ASP.net MVC 3 개 프로젝트읽기 파일 내용을 사용하여 표준 드라이버가

public FileContentResult ProfileImage(ObjectId id) 
{ 

    using (var db = new MongoSession<User>()) 
    { 
     var user = db.Queryable.Where(p => p.Id == id).FirstOrDefault(); 
     if (user != null && user.ProfilePicture != null) 
     { 
      return File(user.ProfilePicture.Content.ToArray(), user.ProfilePicture.ContentType); 
     } 

     return null; 
    } 
} 

의 코드를 다음과 같은 것을 수행하는 MongoDB를에 저장되어있는 이미지 파일을 읽을려고 쿼리 할 때 데이터베이스 ProfilePicture 파일에 대한 컨텐트가 있음을 볼 수 있지만 C# 프로젝트의 경우 여기에서 컨텐트 길이는 0입니다. 코드에 이상이 있습니까? 당신이 User에서 작동하지 않습니다

class User 
{ 
    public GridFile ProfilePicture {get; set;} 
} 

같은 것을 GridFile을 내장하는 것처럼

+0

Mongo에서 ProfilePicture는 어떤 유형의 필드입니까? – Aaronontheweb

+0

user.ProfilePicture.Content.ToArray()가 빈 배열입니까? –

+0

@Aaronontheweb 그것은'GridFile'입니다. @ Judah 예 그것은 비어 있습니다. –

답변

1

같습니다; 적어도 기본 동작을 통해서가 아닙니다. GridFile의 일류 시민으로 취급해야하며, 그들은 GridFileCollection 객체를 사용하여 저장 및 검색해야합니다

var gridFS = conn.Database.Files(); 
var file = new GridFile(); 
// initialize file 
gridFS.Save(file); 
// query 
var file2 = gridFS.FindOne(new { _id = file.Id }); 
// now, you can iterate file2.Content 

당신은 NoRM's unit tests에서 더 많은 작업 샘플 코드를 찾을 수 있습니다.

이유는 기본적으로 GridFile은 다른 클래스와 같은 클래스이지만, 그리드 파일의 저장 체계는 매우입니다. '보통'객체는 내부에서 직렬화되고 하나의 객체는 항상 하나의 객체에 해당하지만 GridFile에서는 그렇지 않습니다.

파일은 MongoDB의 최대 문서 크기보다 훨씬 클 수 있으므로 chunks으로 분할됩니다. 따라서 GridFile을 저장할 때 드라이버는 그리드 파일 을 여러 개의 청크로 저장해야합니다. 기본적으로 청크의 크기는 256kB이므로 청크의 수는 데이터 크기에 따라 다릅니다. 기본 모음 이름은 fs.filesfs.chunks입니다. 당신은 단순히 내장 GridFile 객체를 저장하는 대신 GridFileCollection를 검색하기 위해 명시 적으로 Files() 확장을 호출하는 경우

이 모든 논리는 GridFileCollection 클래스에있는, 그래서 그것은 실행되지 않습니다.