2013-10-09 4 views
1

우리 시스템이 호스팅되는 환경에 따라 사용자가 업로드 한 파일을 관리하기 위해 다른 '파일 시스템'을 사용합니다. 예를 들어, 우리의 개발 환경에서 우리는 Windows 파일 시스템을 사용하지만, 우리는 Azure BLOB 저장소를 사용합니다. 공급자 모델을 사용업로드 된 파일을 처리하는 IFileRepositoryProvider

, 나는 다음과 같은 인터페이스를 만들었습니다 파일이 저장되는 방법/삭제/등의

public interface IFileRepositoryProvider 
{ 
    void SaveFile(string fileName, Stream fileStream); 

    void DeleteFile(string fileName); 

    bool Exists(string fileName); 

    Stream GetStream(string fileName); 
} 
  • 세부 사항은 완전히 IFileRepositoryProvider의 구체적인 구현에 의해 캡슐화됩니다.
  • 하늘색 얼룩 저장에는 몇 가지 제한 사항이 있습니다. 필자는 웹 서버의 가상 디렉터리에서 호스팅되는 것처럼 직접 "URI"를 파일에 제공 할 수는 없습니다. 이러한 이유로 저는 스트림으로 완전히 작업하기로 결정했습니다. 필요에 따라 스트림을 처리하는 것은 클라이언트 코드에 달려 있습니다.

질문 :

  • 겠습니까 FileStream 또는 MemoryStream 더 나은?
  • 오히려 바이트 배열로 파일을 노출하는 이점이 있습니까?
  • 이 접근법의 심각한 단점을 볼 수 있습니까?
+1

Windows Azure에서 실행하면 BLOB가 공용 컨테이너 또는 개인 저장소에 저장됩니까? – MikeWo

+0

개인 컨테이너. – davenewza

답변

3

FileStream 또는 MemoryStream 또는 다른 스트림 유형을 사용하는지 여부는 중요하지 않습니다. 인터페이스는 스트림을 받아 들여야하고 다양한 입력을 처리 할 수 ​​있습니다.

스트림은 바이트 배열보다 융통성이 있습니다. 한 가지주의해야 할 점은 인터페이스에 전달하기 전에 스트림에서 position = 0을 설정하는 것을 종종 기억해야한다는 것입니다.

당신은 또한 비동기에 대해 생각해야하고 적절한 스트리밍 처리 할 것인지 여부에 대해 - 여전히 클라이언트에서 데이터를 수신하는 동안 하늘빛의 BLOB 저장소에 쓰기 즉, (이 길 푸른 스토리지 API의 작품과 약간 까다로울 수있다).

내가 말하고자하는 한 가지는 Azure blob 저장소가 파일 이름과 같은 파일 시스템처럼 동작하도록 만드는 것처럼 보이는 것입니다. Azure blob 저장소에는 파일을 호출 할 수있는 것에 대한 특정 제한이 있습니다. 본질적으로 "이름"은 URI로 인코딩되어야합니다. Azure blob 저장소가 식별자에서 효과적으로 작동하고 파일 시스템에서 에뮬레이트하려고한다는 아이디어를 채택하는 것이 더 나은 접근 방법이라는 것을 알게되었습니다. 따라서 파일을 저장하면 이름과 스트림을 전달하고 식별자 (실제로는 URI 또는 ​​URI의 일부 임) 인 문자열이 반환됩니다. 클라이언트는 해당 식별자를 저장해야하며 파일을 검색 할 때 해당 식별자를 제시해야합니다.

다른 이점은 구현시 식별자 생성이 발생하므로 이름 충돌을 피하기 위해 식별자에 GUID를 포함 할 수 있다는 것입니다.

마지막으로, Azure Blob 저장소에 많은 수의 파일을 저장할 계획이라면 찾아보기가 느리고 검색이 거의 불가능하다는 것을 알고 있어야합니다. 따라서 지원을 더 쉽게하려면 식별자를 구성하는 방법에 대해 신중히 생각하십시오. 기술적으로 BLOB 저장소는 평평하지만 식별자에 "/"를 포함시켜 폴더 구조를 에뮬레이션 할 수 있습니다. 예를 들어, 연도 + "/"+ 월 + "/"+ 일 + "/"+ guid + '/'+ Uri.Encode (파일 이름)와 같은 식별자를 만들 수 있습니다. 또는 식별자에 컨텍스트 특정 정보를 포함 할 수 있습니다.

+0

BLOB가 있는지 확인하려면 Windows Azure 저장소 클라이언트 라이브러리에 메서드가 있습니다. http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx –

+0

@Mike 아, 내 잘못입니다. 그것을 지적 주셔서 감사합니다. 답변이 업데이트되었습니다. – Frans

관련 문제