2016-12-26 1 views
2

유료 다운로드로 webapp를 만들고 있습니다. protecting uploads에 대한 Carrierwave 가이드를 따랐습니다. 모든 것이 한 가지를 구하는 것으로 예상하고 있습니다.레일을 표시 전체 경로를 노출시키지 않고 Carrierwave URL

ProductsController가


제품 파일 업 로더

... 
def store_dir 
    "#{Rails.root}/downloads/#{model.product_id}/#{model.id}" 
end 
... 

경로

get "/downloads/:product_id/:product_file_id/:filename", :controller => "products", action: "download", conditions: {method: :get} 

: 여기 내 현재 설정입니다


문제가 다운로드 경로입니다. 파일 업 로더에서 #{Rails.root}을 지정했기 때문에 파일은 downloads이라는 공용 폴더 외부 폴더에 저장됩니다. 그러나 의도하지 않은 부작용이 있습니다. 모델에서 URL을 검색 할 때 레일스 루트와 관련된 경로가 아닌 전체 절대 경로를 얻습니다.

예를 들어, ProductFile.first.file.url"/home/doomy/Documents/resamplr/downloads/3/1/aaaa.zip"을 반환하며 대신 /downloads/3/1/aaa.zip을 반환해야합니다.

이 동작은 ProductFileUploader에 지정된 내용에 첨부 된 것 같습니다.

예를 들어 store_dir"/downloads/#{model.product_id}/#{model.id}"으로 변경하면 내 PC의 루트에 업로드하려고하기 때문에 액세스 오류가 발생합니다. "downloads/#{model.product_id}/#{model.id}"은 단순히 다운로드라고하는 public 디렉토리의 새 폴더에 업로드합니다. 원하는 작업이 아닙니다.

진행 방법에 대한 조언이 있으십니까? 감사.


편집 :

나는 Rails.root에 Carrierwave 설정 파일에 config.root을 설정하면이 동작을 허용 것으로 나타났습니다. 이 경우 내 ProductFileUploader에서 store_dir"downloads/#{model.product_id}/#{model.id}으로 지정할 수 있습니다.

그러나 공용 파일은 "/ public/..."링크와 함께 저장된다는 의미입니다. Rails는 공용 폴더 이름을 자동으로 삭제하고 URL에 하위 디렉토리 이름을 사용합니다.

답변

1

해결 방법을 알아 냈습니다!

각 업 로더에는 보이지 않는 파일 경로를 설정하는 데 사용할 수있는 root이라는 특별한 방법이 있습니다. 먼저 PublicUploader라는 특수 업 로더 기본 클래스를 만들었습니다.

class PublicUploader < CarrierWave::Uploader::Base 
    def root 
    "${Rails.root}/public" 
    end 
end 

그런 다음 전역 CarrierWave 루트를 Rails.root로 설정했습니다.

CarrierWave.configure do |config| 
    # These permissions will make dir and files available only to the user running 
    # the servers 
    config.permissions = 0600 
    config.directory_permissions = 0700 
    config.storage = :file 

    # This avoids uploaded files from saving to public/ and so 
    # they will not be available for public (non-authenticated) downloading 
    config.root = Rails.root 
end 

이것은 내 개인 파일 업 로더에 단순히

def store_dir 
    "downloads/#{model.product_id}/#{model.id}" 
end 

를 쓸 수 및 "#{Rails.root}/public/downloads/..." 반대가 "#{Rails.root}/downloads/..."에 저장됩니다 것을 의미합니다. 즉, 컨트롤러를 사용하여 액세스를 제한 할 수 있습니다.

그러나, 내 공개 업 로더에, 나는 단순히했다

...

def store_dir 
    "public/downloads/#{model.product_id}/#{model.id}" 
end 

... 내 "#{Rails.root}/public" 폴더에 저장하고 싶었 기 때문에. 그러나,이 레일 경로에서 public를 생략로 레일, 다음

/public/downloads/myfile.jpg

이 문제를 제기과 같은 URL을 보여줄 것이라는 점을 의미했다. 업 로더 내가 root을 정의하는 특별한 클래스에서 상속 할 때 따라서 위 (404) 그러나, 그때는 단순히 업로드하고 이미지를 올바르게 표시됩니다

def store_dir 
    "downloads/#{model.product_id}/#{model.id}" 
end 

을 말할 수있는 것입니다! 희망이 사람을 도울 수 있습니다.

관련 문제