2017-10-20 11 views
1

나는 ImageUploader이며 S3에 이미지를 업로드하고 싶습니다. 또한 filename 메서드를 사용하여 파일 이름을 변경하고 싶습니다. 내가 이미지를 저장할 때 그것은 올바른 파일 이름, 예컨대 1_23434.png를 얻을 수 있지만 콘솔에서 모델 객체를 얻을 때, 그것은 다른 이미지의 이름을 반환,Carrierwave 파일 이름 메서드가 파일을 s3에 업로드 할 때 문제가 발생합니다.

class ImageUploader < CarrierWave::Uploader::Base 
    storage :fog 

    def store_dir 
    "images" 
    end 

    def filename 
    "#{model.id}_#{SecureRandom.urlsafe_base64(5)}.#{file.extension}" if original_filename 
    end 
end 

처음 : 다음은 코드입니다.

나를 도울 수있는 사람이 있습니까? 안개를 사용하지 않으면 잘 작동합니다.

+0

왜'filename_' 메소드에서'if original_filename' 조건을 사용합니까? –

+0

파일 이름에 대해 반환되는 값은 무엇입니까? –

답변

0

문제는 filename 방법에 있습니다. 모든 호출에서 다른 값을 반환합니다. SecureRandom.urlsafe_base64(5)은 임의의 문자열을 생성하기 때문에 (그리고 캐시되지 않습니다) 때문입니다. filename은 CarrierWave에서 경로 관련 문자열을 작성하는 데에도 사용됩니다. 콘솔에서 object.image.filename을 실행할 때 이미지 이름이 달라지는 것입니다.

찾고있는 방법은 image_identifier입니다 (여기서 접두사는 업 로더가 탑재 된 이름 아래 image입니다).

당신이 좋아하는 뭔가를 시도 할 수 있습니다 : generate_unique_name 현재 filename 구현입니다

object.public_send("#{object.image.mounted_as}_identifier") || generate_unique_name 

. 또 다른 접근법은 나중에 사용할 수 있도록 해시를 모델 자체에 저장하는 것입니다.

또한 공식 wiki 페이지는 creating random and unique filenames 일 수 있습니다.