2015-01-14 4 views
1

내 Rails 4 앱에서 PaperClip을 사용하여 S3에 이미지를 저장하려고합니다. S3 버킷에 내 이미지의 어떤은 다음과 같습니다RoR : Set PaperClip 이미지 모델 : S3 버킷의 경로가 올바르게

https://mybucketname.s3.amazonaws.com/images/files/000/001/920/original/40a6885fc09c8ed4e1e3745d7f7fb770.jpg

이제 AWS CloudFront를 CDN을 통해 이미지를 제공하기 위해, 나는 다음입니다 this article이 설정 :path 속성을 내 이미지 모델 제안. 여기서 정확한 가치는 무엇입니까?

has_attached_file :file, styles: { small: '120x50', medium: '350x350' }, :path => "images/files/../../:id/:style/:filename" 

특히, 나는 위의 이미지 URL에 /000/001/ 부분을 처리하는 방법에 대한 확실하지 않다. 왜냐하면 S3에 이미지를 저장하는 동안 PaperClip이 만든 임의의 폴더이기 때문입니다. 그렇지 않은 경우 :id, :style and :filename은 런타임에 해당 값을 올바르게 대체합니다.

+0

이 참 이상하다 할 것이다. – duhaime

답변

0

파일 시스템을 사용할 때 각 폴더에 저장할 수있는 파일의 양에 대한 제한이 있습니다..

32,000 개가 넘는 파일을 폴더에 저장할 경우 Linux 시스템에서 오류가 발생합니다. 이러한 이유로 paperclip은 파일을 별도의 폴더에 자동으로 분할합니다. 즉 위의 예에서 000/001/920에 의해 수행되고있는 작업입니다 ..... 이것이 필요합니다.

개체 ID는 1920이며 9 자리 숫자를 얻기 위해 0을 앞에두고 별도의 파티션으로 분할합니다. 수동으로 경로를 설정해야하는 경우 paperclip이이 논리를 처리하는 대신 파일을 수동으로 분할해야합니다. 그렇지 않으면 결국 큰 문제가 발생합니다. 나는 당신에 대해 아무것도 할 필요가 없습니다 생각

+0

좋은 설명 주셔서 감사합니다. 하지만 내 문제는 이미지가 이미 S3에 저장되어 있다는 것입니다. 이제 CDN을 사용하려면 PaperClip이 모든 이미지에 대해 직접 버킷 경로 대신 CDN 호스트 값을 대체 할 수 있도록 ** : 경로 **를 템플릿으로 제공해야합니다. – theGeekster

+0

하지만 위에서 언급 한 유일한 질문은 "위의 이미지 URL에서/000/001/부분을 처리하는 방법에 대해 잘 모르겠습니다"입니다. 위의 파일 경로의/000/0001/부분은 관련 객체 ID의 일부입니다. 전체 형식의 ID는 000001920입니다. id가 자동으로 반환하는 대상은 id가 1920입니다. 정규 표현식을 사용하여 if 숫자가 9 자리보다 작 으면 9 자리 숫자로 포맷하려면 0을 앞에두고 분리 작업을 수행하고 디렉토리 나누기 /에 백 슬래시를 추가하십시오. ID가 555444666 인 경우/555/444/666으로 포맷해야합니다. –

0

: 경로, 당신은하지 S3

0

당신이 찾고있는 기호로, 당신의 CloudFront를 도메인 이름에서 확인 config.action_controller.asset_host 점을 확인해야합니다 is : id_partition. S3는 분명히 현재 양동이에 자산의 수에 제한을 두지 않는

그래서 전체 경로,

images/files/:id_partition/:style/:filename