2014-06-09 1 views
2

s3을 사용하여 사용자 업로드 시스템을 실행하는 데 어떤 것이 좋을지 궁금합니다. 업 로더, 크기 등과 같은 메타 데이터를 저장하기 위해 MongoDB를 사용할 계획입니다. s3에 실제 파일을 저장하는 방법은 어떻게해야합니까?S3 사용자 업로드의 모범 사례는 무엇입니까?

여기 내 아이디어가 있습니다. 무엇이 최고라고 생각합니까? 이 모든 예제는 메타 데이터를 MongoDB에 저장하는 작업을 포함합니다.

1. 모든 파일을 버킷에 저장해야합니까?
2. 날짜로 구성 할 수 있습니다 (예 : 6/8/2014/mypicture.png)?
3. 중복을 피하기 위해 문자열을 모두 하나의 버킷에 저장해야하지만 문자열을 추가해야합니다 (예 : d1JdaZ9-mypicture.png).
4. 또는 폴더에 긴 문자열을 생성하고 해당 폴더에 파일을 저장해야합니다. (원래 파일 이름을 유지하기 위해). 예 : sh8sb36zkj391k4dhqk4n5e4ndsqule6/mypicture.png

답변

3

이것은 주로 그림과 개체/클래스/모듈/등을 어떻게 사용할지에 달려 있습니다. 귀하의 코드에서 실제로 그들을 검색하는 거래 것입니다. "특정 일에 모든 사용자 업로드"- - 간단한 명명 규칙을 폴더와 함께 년, 월, 일에 대한 폴더로의 최상위에

  1. 당신은 자신과 같은 일을하고 싶은 찾을 경우

    사용자의 고유 ID로 문제가 해결됩니다.

  2. 고유성을 보장하고 양동이에서 충돌을 피하려면 고유 한 문자열을 생성 할 수 있습니다. 당신이 실제로 등 날짜에 의해 사용자 업로드 이러한 쿼리를 처리합니다 (내가 있으리라 믿고있어)하여 MongoDB를 가지고 있기 때문에

그러나,이 기능에 비해 버킷의 선택이 더 미적 있습니다.

mongoDB에 키/URL을 모두 저장하는 경우 버킷의 실제 구조가 무엇인지는 중요하지 않습니다. 그럼에도 불구하고이를 일관된 방식으로 분할하는 것은 의미가 있습니다. 사용자의 모든 업로드를 그룹화하고 각 고유 한 이름을 지정합니다 (고유 한 이름을 생성하거나 파일 이름에 고유 한 접두사를 붙이십시오).

그렇다면 이미지 저장 방식을 변경할 때가 있을지 모릅니다. CDN으로 이동할 수 있습니다. 제 3자는 당신이 시도하고 싶을지도 모른 더 싼 더 나은 제품을 제안 할지도 모르다. 이와 같은 경우 단순히 모든 키/URL을 MongoDB에 저장하는 것은 좋은 방법이 아닙니다. 모든 항목을 업데이트해야하기 때문입니다.

상대적으로 미래를 보장하려면 업로드를 명확한 구조로 제안하십시오. 나는 보통 다음을 선택합니다 :

bucket_name/user_id/yyyy/mm/dd/unique_name.jpg 

데이터베이스는 파일 이름과 업로드 타임 스탬프 만 저장하면됩니다.

논리에 중간 계층을 도입 할 수 있습니다 (새로운 클래스 또는 헬퍼 함수/메소드).이 정보를 기반으로 파일의 URL을 생성합니다. 그런 식으로 저장 방법을 나중에 변경하면 (파일을 마이그레이션 한 후에)이 중간 계층에서 약간의 변경 만하면되고 MongoDB는 걱정할 필요가 없습니다.