종이클립은 더 이상 사용되지 않습니다 .
새로운 프로젝트의 경우 Rails 자체 ActiveStorage를 권장합니다.
기존 프로젝트의 경우 영어로 제공되는 마이그레이션 가이드와 RailsConf 2019에서 녹화된 비디오를 참조하고 이에 기여하세요. Doorkeeper에서 사용하는 대체 마이그레이션 튜토리얼을 선호할 수도 있습니다.
또는 기존 프로젝트의 경우 Kreeti는 Paperclip의 지속적인 포크인 kt-paperclip을 유지 관리하고 있습니다.
우리는 이슈를 토론 포럼으로 만 열어두겠습니다. 우리는 이슈에 대한 응답을 보장하지 않습니다 . 모든 버그 보고서는 kt-paperclip으로 이동해야 합니다.
마이그레이션 가이드에 대한 풀 요청을 제외하고 더 이상 풀 요청을 수락하지 않습니다. 다른 모든 풀 요청은 병합되지 않고 종료됩니다.
master
브랜치에 유효한 문서사용 중인 클립 버전에 대한 설명서를 확인하세요: https://github.com/thoughtbot/paperclip/releases
요구사항
루비와 레일즈
이미지 프로세서
file
설치
빠른 시작
모델
마이그레이션
편집 및 새로운 보기
간단한 양식을 사용한 편집 및 새 보기
제어 장치
도우미 보기
파일이 존재하는지 확인하기
첨부 파일 삭제
용법
검증
국제화(I18n)
보안 검증
기본값
마이그레이션
테이블에 첨부 열 추가
스키마 정의
빈티지 구문
저장
스토리지 이해
IO 어댑터
후처리
맞춤형 첨부 프로세서
이벤트
URI 난독화
체크섬/지문
일시 삭제를 위한 파일 보존
동적 구성
동적 스타일:
동적 프로세서:
벌채 반출
전개
첨부 파일 스타일
테스트
기여
특허
생각봇 소개
Paperclip은 ActiveRecord를 위한 간편한 파일 첨부 라이브러리로 만들어졌습니다. 그 뒤에 있는 의도는 가능한 한 쉽게 설정을 유지하고 파일을 다른 속성과 최대한 비슷하게 처리하는 것이었습니다. 즉, ActiveRecord::Base#save가 호출될 때까지 디스크의 최종 위치에 저장되지 않으며 nil로 설정되어도 삭제되지 않습니다. 필요한 경우 크기와 존재 여부를 기준으로 유효성 검사를 관리합니다. 필요한 경우 할당된 이미지를 축소판으로 변환할 수 있으며 전제 조건은 ImageMagick을 설치하는 것만큼 간단합니다(대부분의 최신 Unix 기반 시스템의 경우 올바른 패키지를 설치하는 것만 큼 쉽습니다). 첨부된 파일은 파일 시스템에 저장되고 합리적이고 유용한 기본값이 있는 쉽게 이해할 수 있는 사양에 따라 브라우저에서 참조됩니다.
자세한 옵션은 Paperclip::ClassMethods
의 has_attached_file
설명서를 참조하세요.
전체 RDoc이 온라인에 있습니다.
이제 Paperclip에는 Ruby 버전 >= 2.1 및 Rails 버전 >= 4.2 가 필요합니다(Ruby on Rails에서 Paperclip을 사용하려는 경우에만 해당).
ImageMagick이 설치되어 있어야 하며 Paperclip이 이에 액세스할 수 있어야 합니다. 이를 확인하려면 명령줄에서 which convert
(ImageMagick 유틸리티 중 하나)를 실행하세요. 그러면 해당 유틸리티가 설치된 경로가 제공됩니다. 예를 들어 /usr/local/bin/convert
반환할 수 있습니다.
그런 다음 환경 구성 파일에서 해당 디렉터리를 해당 경로에 추가하여 Paperclip이 그곳을 찾도록 알립니다.
개발 모드에서는 다음 줄을 config/environments/development.rb)
에 추가할 수 있습니다.
Paperclip.options[:command_path] = "/usr/local/bin/"
Mac OS X를 사용하는 경우 Homebrew로 다음을 실행하는 것이 좋습니다.
brew install imagemagick
PDF 업로드를 처리하거나 테스트 모음을 실행하는 경우 GhostScript도 설치해야 합니다. Mac OS X에서는 Homebrew를 사용하여 설치할 수도 있습니다.
brew install gs
Ubuntu(또는 Debian 기반 Linux 배포판)를 사용하는 경우 apt-get을 사용하여 다음을 실행하고 싶을 것입니다.
sudo apt-get install imagemagick -y
file
콘텐츠 유형 확인에는 Unix file
명령이 필요합니다. 이 유틸리티는 Windows에서는 사용할 수 없지만 Ruby Devkit과 함께 번들로 제공되므로 Windows 사용자는 devkit이 설치되어 시스템 PATH
에 추가되었는지 확인해야 합니다.
수동 설치
Windows 7+를 개발 환경으로 사용하는 경우 file.exe
애플리케이션을 수동으로 설치해야 할 수도 있습니다. Paperclip 4+의 file spoofing
시스템은 이에 의존합니다. 작동하지 않으면 Validation failed: Upload file has an extension that does not match its contents.
오류.
수동으로 설치하려면 다음을 수행해야 합니다.
이 URL에서
file
다운로드 및 설치
테스트하려면 아래 이미지를 사용할 수 있습니다.
다음으로 환경과 통합해야 합니다. PATH
변수를 사용하거나 config/environments/development.rb
파일을 변경하는 것이 좋습니다.
길
1. Click "Start" 2. On "Computer", right-click and select "Properties" 3. In Properties, select "Advanced System Settings" 4. Click the "Environment Variables" button 5. Locate the "PATH" var - at the end, add the path to your newly installed `file.exe` (typically `C:Program Files (x86)GnuWin32bin`) 6. Restart any CMD shells you have open & see if it works
또는
환경
1. Open `config/environments/development.rb` 2. Add the following line: `Paperclip.options[:command_path] = 'C:Program Files (x86)GnuWin32bin'` 3. Restart your Rails server
이러한 방법 중 하나를 사용하면 Rails 설정에서 file.exe
기능에 액세스할 수 있으므로 파일 내용을 확인할 수 있는 기능이 제공됩니다(스푸핑 문제 해결).
Paperclip은 gem으로 배포되므로 앱에서 사용해야 합니다.
Gemfile에 gem을 포함하세요:
gem "클립", "~> 6.0.0"
또는 최신 내용을 얻으려면 기본 클립 저장소에서 마스터를 얻을 수 있습니다.
gem "paperclip", git: "git://github.com/thoughtbot/paperclip.git"
최신 릴리스 gem에는 없는 것 같지만 이 README에 언급된 기능을 사용하려는 경우 해당 기능을 사용하려면 마스터 브랜치를 지정해야 할 것입니다. 이 README는 GitHub에서 읽고 있다면 아마도 최신 릴리스 버전보다 앞서 있을 것입니다.
레일이 아닌 용도의 경우:
클래스 ModuleName < ActiveRecord::Base 포함 Paperclip::Glue ...끝
class User < ActiveRecord::Base has_attached_file :avatar, styles: { Medium: "300x300>", Thumb: "100x100>" }, default_url: "/images/:style/missing.png" verifys_attachment_content_type :avatar, content_type: / Aimage/.*z/end
users
테이블이 있다고 가정하고 users
테이블에 avatar
열을 추가합니다.
class AddAvatarColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down Remove_attachment :users, :avatar endend
(또는 Rails 마이그레이션 생성기를 사용할 수 있습니다. rails generate paperclip user avatar
.)
컨트롤러에 해당 메서드가 있는지 확인하세요.
<%= form_for @user, url: users_path, html: { multipart: true } do |form| %> <%= form.file_field :avatar %> <%= form.submit %><% end %>
<%= simple_form_for @user, url: users_path do |form| %> <%= form.input :avatar, 다음과 같이: :file %> <%= form.submit %><% end %>
def create @user = User.create(user_params)endprivate# 속성 화이트리스트에 Strong_parameters 사용# create() 및 update() 컨트롤러 메서드를 업데이트해야 합니다.def user_params params.require(:user).permit(:avatar)end
이미지를 표시하려는 뷰에 다음을 추가하세요.
<%= image_tag @user.avatar.url %><%= image_tag @user.avatar.url(:medium) %><%= image_tag @user.avatar.url(:thumb) %>
파일이 존재하는지 확인하는 방법에는 두 가지가 있습니다.
file?
그리고 present?
_file_name
필드가 채워졌는지 확인합니다.
exists?
파일이 존재하는지 확인합니다(클라우드에 저장된 경우 TCP 연결을 수행함).
파일이 루프에 있는지 확인하는 경우 이 점을 염두에 두십시오. 첫 번째 버전은 성능이 훨씬 더 뛰어나지만 의미가 다릅니다.
속성을 nil
로 설정하고 저장합니다.
@user.avatar = [email protected]
Paperclip의 기본은 매우 간단합니다. 모델에 has_attached_file
메소드를 사용하여 첨부 파일이 있음을 선언하고 이름을 지정합니다.
Paperclip은 최대 4개의 속성(모두 해당 첨부 파일의 이름이 앞에 붙으므로 원하는 경우 모델당 여러 개의 첨부 파일을 가질 수 있음)을 래핑하고 친숙한 프런트 엔드를 제공합니다. 이러한 속성은 다음과 같습니다.
기본적으로 Paperclip이 작동하려면
만 필요합니다. 콘텐츠 유형 유효성 검사를 사용하려면
추가해야 합니다.
has_attached_file
에 전달된 옵션에 대한 자세한 내용은 Paperclip::ClassMethods
문서에서 확인할 수 있습니다.
유효성 검사를 위해 Paperclip에는 첨부 파일의 유효성을 검사하는 여러 유효성 검사기가 도입되었습니다.
AttachmentContentTypeValidator
AttachmentPresenceValidator
AttachmentSizeValidator
사용 예:
검증 :avatar, attachment_presence: truevalidates_with AttachmentPresenceValidator, 속성: :avatarvalidates_with AttachmentSizeValidator, 속성: :avatar, less_than: 1.megabytes
유효성 검사기는 이전 도우미 스타일을 사용하여 정의할 수도 있습니다.
validates_attachment_presence
validates_attachment_content_type
validates_attachment_size
사용 예:
verifys_attachment_presence :아바타
마지막으로, validates_attachment
사용하여 단일 첨부 파일에 대해 여러 유효성 검사를 정의할 수도 있습니다.
verifys_attachment :avatar, 존재 여부: true, content_type: "image/jpeg", 크기: { in: 0..10.kilobytes }
참고: 유효성 검사에 따라 첨부 파일이 유효하지 않은 경우 사후 처리가 시작 되지 않습니다. 콜백과 프로세서는 유효한 첨부 파일이 있는 경우 에만 호출됩니다.
클래스 메시지 < ActiveRecord::Base has_attached_file :asset, 스타일: { Thumb: "100x100#" } before_post_process :skip_for_audio def skip_for_audio ! %w(오디오/ogg 애플리케이션/ogg).include?(asset_content_type) endend
할당 순서에 따라 다른 유효성 검사가 있는 경우 권장되는 조치는 이후까지 첨부 파일 할당을 방지한 다음 수동으로 할당하는 것입니다.
class Book < ActiveRecord::Base has_attached_file :document, styles: { Thumbnail: "60x60#" } verifys_attachment :document, content_type: "application/pdf" verifys_something_else # Paperclip의sendclass BooksController < ApplicationController def create @book = Book.new(book_params) @book.document = params[:book][:document] @book.save response_with @book end private def book_params params.require(:book).permit(:title, :author) endend
content_type 유효성 검사 및 보안에 대한 참고 사항
명시적으로 지원하려는 MIME 유형만 파일인지 확인해야 합니다. 그렇지 않으면 사용자가 악성 HTML 페이로드가 포함된 파일을 업로드하는 경우 XSS 공격에 노출될 수 있습니다.
이미지에만 관심이 있는 경우 허용되는 content_type을 이미지 유형으로 제한하세요.
verifys_attachment :avatar, content_type: ["image/jpeg", "image/gif", "image/png"]
Paperclip::ContentTypeDetector
파일의 실제 내용에 관계없이 파일 확장자를 유추된 content_type과 일치시키려고 시도합니다.
다른 언어로 로케일 파일을 사용하거나 추가하려면 https://github.com/thoughtbot/paperclip-i18n 프로젝트를 확인하세요.
Egor Homakov의 보고서 덕분에 우리는 사람들이 콘텐츠 유형을 스푸핑하고 예상치 못한 데이터를 서버에 가져오는 것을 방지하기 위한 조치를 취했습니다.
참고: 버전 4.0.0부터 모든 첨부 파일에는 content_type 유효성 검사, file_name 유효성 검사를 포함하거나 둘 중 하나도 포함하지 않을 것임을 명시적으로 명시 해야 합니다 . 이렇게 하지 않으면 Paperclip에서 오류가 발생합니다 .
class ActiveRecord::Base has_attached_file :avatar # 콘텐츠 유형 유효성 검사 verifys_attachment_content_type :avatar, content_type: /Aimage/ # 파일 이름 유효성 검사 verifys_attachment_file_name :avatar, matchs: [/pngz/, /jpe?gz/] # 명시적으로 하지 않음 do_not_validate_attachment_file_type 유효성 검사:avatarend
이렇게 하면 기본적으로 Paperclip의 보안이 유지되고 사람들이 파일 시스템을 엉망으로 만드는 것을 방지할 수 있습니다.
참고: 또한 버전 4.0.0부터 Paperclip에는 끌 수 없는 또 다른 유효성 검사가 있습니다. 이 유효성 검사를 통해 콘텐츠 유형 스푸핑을 방지할 수 있습니다. 즉, 올바른 형식의 JPEG의 EXIF 태그의 일부로 PHP 문서(예:)를 업로드하는 것입니다. 이 검사는 미디어 유형(MIME 유형의 첫 번째 부분, 즉 text/plain
의 'text')으로 제한됩니다. 이렇게 하면 HTML 문서가 JPEG로 업로드되는 것을 방지할 수 있지만 .jpg
확장자를 사용하여 GIF를 업로드하는 것은 방지할 수 없습니다. 이 유효성 검사는 양식에 유효성 검사 오류만 추가합니다. 오류가 발생하지 않습니다.
이로 인해 사용자 정의 파일 확장자를 사용하는 응용 프로그램에서 잘못된 유효성 검사 오류가 발생할 수 있습니다. 이러한 경우 config/initializers/paperclip.rb
생성하여 콘텐츠 유형 매핑 목록에 사용자 정의 확장을 추가할 수 있습니다.
# MIME 유형이 "text/plain"인 파일의 확장자로 ".foo"를 허용합니다.Paperclip.options[:content_type_mappings] = { foo: %w(text/plain)}
모든 Paperclip 첨부 파일에 대한 전역 기본값은 Paperclip::Attachment.default_options 해시를 변경하여 정의할 수 있습니다. 이는 예시별로 기본 저장소 설정을 지정하는 데 유용할 수 있으므로 모든 has_attached_file
정의에서 이를 정의할 필요가 없습니다.
Rails를 사용하는 경우 config/application.rb
또는 config.paperclip_defaults의 config/environments/*.rb
파일에서 기본 옵션으로 해시를 정의할 수 있습니다. Rails 앱이 부팅되면 Paperclip::Attachment.default_options
에 병합됩니다. 예:
module YourApp class Application < Rails::Application # 기타 코드... config.paperclip_defaults = { Storage: :fog, Fog_credentials: { 공급자: "Local", local_root: "#{Rails.root}/public"}, Fog_directory: "", Fog_host: "localhost"} 끝
또 다른 옵션은 Paperclip::Attachment.default_options
해시를 직접 수정하는 것입니다. 이 방법은 Rails가 아닌 애플리케이션에 작동하거나 초기화 프로그램에 Paperclip 기본 설정을 배치하려는 경우의 옵션입니다.
Rails 초기화 프로그램의 예는 다음과 같습니다:
Paperclip::Attachment.default_options[:storage] = :fogPaperclip::Attachment.default_options[:fog_credentials] = { 공급자: "Local", local_root: "#{Rails.root}/public"}Paperclip::Attachment.default_options[ :fog_디렉토리] = ""Paperclip::Attachment.default_options[:fog_host] = "http://localhost:3000"
Paperclip은 모델에 필요한 열을 생성하는 데 사용할 수 있는 여러 가지 마이그레이션 방법을 정의합니다. 이를 지원하는 두 가지 유형의 도우미 메서드가 있습니다.
테이블을 생성할 때 attachment
도우미를 사용할 수 있습니다.
class CreateUsersWithAttachments < ActiveRecord::Migration def up create_table :users do |t| t.attachment :avatar end end # 이것은 Paperclip 첨부를 위해 사용자 테이블만 사용한다고 가정합니다. 조심해서 내려주세요! def down drop_table :사용자 끝
위의 up
/ down
조합 대신 아래와 같이 change
방법을 사용할 수도 있습니다.
클래스 CreateUsersWithAttachments < ActiveRecord::Migration def 변경 create_table :users do |t| t.attachment :avatar end endend
또는 add_attachment
및 remove_attachment
메소드를 사용하여 기존 테이블에 새 Paperclip 열을 추가할 수 있습니다.
class AddAttachmentColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down Remove_attachment :users, :avatar endend
또는 다음과 같이 change
메소드를 사용하여 이를 수행할 수 있습니다.
class AddAttachmentColumnsToUsers < ActiveRecord::Migration def 변경 add_attachment :users, :avatar endend
빈티지 구문(예: t.has_attached_file
및 drop_attached_file
)은 여전히 Paperclip 3.x에서 지원되지만 이 새 구문을 사용하려면 해당 마이그레이션 파일을 업데이트하는 것이 좋습니다.
Paperclip에는 3개의 스토리지 어댑터가 함께 제공됩니다.
파일 저장
S3 스토리지( aws-sdk-s3
통해)
안개 저장
Paperclip을 다른 저장소와 함께 사용하려면 Paperclip과 함께 다음 gem을 설치하면 됩니다.
클립 - 하늘색
클립-Azure-저장
클립-드롭박스
첨부 파일로 할당된 파일은 기본적으로 has_attached_file
에 대한 :path
옵션으로 지정된 디렉터리에 배치됩니다. 기본적으로 이 위치는 :rails_root/public/system/:class/:attachment/:id_partition/:style/:filename
입니다. 표준 Capistrano 배포에서 public/system
디렉터리가 앱의 공유 디렉터리에 심볼릭 링크될 수 있기 때문에 이 위치가 선택되었습니다. 즉, 배포 간에도 유지됩니다. 예를 들어, :path
를 사용하면 다음 위치에 파일이 있을 수 있습니다.
/data/myapp/releases/20081229172410/public/system/users/avatar/000/000/013/small/my_pic.png
참고 : 이는 이전 버전의 Paperclip에서 변경된 사항이지만 전반적으로 기본 파일 저장소에 대한 더 안전한 선택입니다.
Amazon의 S3 서비스를 사용하여 파일을 저장하도록 선택할 수도 있습니다. 이렇게 하려면 Gemfile에 aws-sdk-s3
gem을 포함하십시오.
보석 'aws-sdk-s3'
그런 다음 has_attached_file
에서 S3을 사용하여 지정할 수 있습니다. Paperclip::Storage::S3
설명서에서 S3 스토리지 구성 및 사용에 대한 자세한 내용을 확인할 수 있습니다.
로컬 파일 시스템(및 Rails 앱의 공개 디렉터리)에 있는 파일은 인터넷에서 광범위하게 사용할 수 있습니다. 액세스 제어가 필요한 경우 파일을 다른 위치에 배치할 수 있습니다. 파일을 공개적으로 사용할 수 없도록 하려면 :path
및 :url
옵션을 모두 변경해야 합니다. :path
와 :url
모두 동일한 보간 변수 세트를 허용합니다.
파일이 업로드되거나 첨부되면 Rails의 UploadedFile 객체에서 StringIO, Tempfile 또는 이미지를 가리키는 URL인 간단한 문자열에 이르기까지 몇 가지 다른 입력 형식 중 하나가 될 수 있습니다.
Paperclip은 기본적으로 이러한 소스 중 다수를 허용합니다. 또한 약간의 구성으로 더 많은 작업을 처리할 수 있습니다. 로컬이 아닌 소스의 이미지를 처리하는 IO 어댑터는 기본적으로 활성화되어 있지 않습니다. config/initializers/paperclip.rb
에 다음과 유사한 줄을 추가하여 활성화할 수 있습니다.
Paperclip::DataUriAdapter.register
필요한 경우에만 원격 로딩 어댑터를 활성화하는 것이 가장 좋습니다. 그렇지 않으면 누군가가 이를 벡터로 사용하여 내부 네트워크 구조에 대한 통찰력을 얻을 가능성이 있습니다.
다음 어댑터는 기본적으로 로드되지 않습니다 .
Paperclip::UriAdapter
- URI
인스턴스를 허용합니다.
Paperclip::HttpUrlProxyAdapter
- http
문자열을 허용합니다.
Paperclip::DataUriAdapter
- Base64로 인코딩된 data:
문자열을 허용합니다.
Paperclip은 확장 가능한 후처리 프로세서 선택을 지원합니다. 첨부 파일에 대한 스타일 세트를 정의할 때 기본적으로 해당 "스타일"은 실제로 "썸네일"일 것으로 예상됩니다. 이는 Paperclip::Thumbnail
에 의해 처리됩니다. 이전 버전과의 호환성을 위해 단일 도형 문자열 또는 도형과 파일이 변환될 형식을 포함하는 배열을 전달할 수 있습니다. 다음과 같습니다.
has_attached_file :avatar, 스타일: { Thumb: ["32x32#", :png] }
업로드된 항목에 관계없이 "엄지손가락" 스타일을 PNG 형식의 32x32 정사각형으로 변환합니다. 형식을 지정하지 않으면 동일하게 유지됩니다(예: JPG는 JPG로 유지됩니다). Paperclip::Thumbnail
ImageMagick을 사용하여 이미지를 처리합니다. ImageMagick의 기하학 문서에는 허용되는 스타일 형식에 대한 자세한 정보가 있습니다.
변환 프로세스를 보다 세밀하게 제어하려면 source_file_options
및 convert_options
사용하여 여기에 설명된 ImageMagick의 강력한 변환 도구에 플래그와 설정을 직접 전달할 수 있습니다. 예를 들어:
has_attached_file :이미지, 스타일: { 일반: ['800x800>', :png]}, source_file_options: { 일반: "-밀도 96 -깊이 8 -품질 85" }, 변환_옵션: { 일반: "-포스터화 3"}
ImageMagick은 리소스 제한을 제어하기 위한 다양한 환경 변수를 지원합니다. 예를 들어 애플리케이션의 프로세스 환경에서 다음 변수를 설정하여 메모리 또는 실행 시간 제한을 적용할 수 있습니다.
MAGICK_MEMORY_LIMIT=128MiB
MAGICK_MAP_LIMIT=64MiB
MAGICK_TIME_LIMIT=30
변수 및 설명의 전체 목록은 ImageMagick의 리소스 문서를 참조하세요.
워터마크 추가, 이미지 압축, 파일 암호화 등의 작업을 수행하기 위해 사용자 정의 첨부 프로세서를 직접 작성할 수 있습니다. 사용자 정의 프로세서는 Paperclip
모듈 내에서 정의되고 Paperclip::Processor
( lib/paperclip/processor.rb
참조)에서 상속되며 File
반환하는 make
메소드를 구현해야 합니다. Rails 앱의 lib/paperclip
및 lib/paperclip_processors
디렉터리에 있는 모든 파일은 Paperclip에 의해 자동으로 로드됩니다. 프로세서는 has_attached_file
에 대한 :processors
옵션을 사용하여 지정됩니다.
has_attached_file :scan, 스타일: { 텍스트: { 품질: :better } }, 프로세서: [:ocr]
그러면 가상 클래스 Paperclip::Ocr
로드되고 업로드된 파일과 함께 옵션 해시 { quality: :better }
가 전달됩니다.
여러 프로세서를 지정할 수 있으며 :processors
배열에 정의된 순서대로 호출됩니다. 각각의 연속 프로세서에는 이전 프로세서의 결과가 제공됩니다. 모든 프로세서는 :styles
해시에 정의된 동일한 매개변수를 받습니다. 예를 들어, 다음과 같은 정의가 있다고 가정합니다.
has_attached_file :scan, 스타일: { 텍스트: { 품질: :better } }, 프로세서: [:rotator, :ocr]
:rotator
프로세서와 :ocr
프로세서 모두 { quality: :better }
옵션을 받습니다. 프로세서가 인식하지 못하는 옵션을 받으면 이를 무시해야 합니다.
참고: 프로세서는 원래 부착물을 스타일로 변환하여 작동하므로 스타일이 정의되지 않은 경우 프로세서가 실행되지 않습니다.
데이터베이스에 썸네일의 너비, 높이, 크기를 캐싱하는 데 관심이 있다면 paperclip-meta gem을 살펴보세요.
또한 즉석에서 썸네일을 생성하는 데 관심이 있다면 attachment_on_the_fly gem을 살펴보는 것이 좋습니다.
Paperclip의 썸네일 생성기( lib/paperclip/thumbnail.rb
참조)는 프로세서로 구현되며 자신만의 프로세서를 작성하는 데 좋은 참고 자료가 될 수 있습니다.
사후 처리 단계 전후에 Paperclip은 몇 가지 콜백을 통해 모델을 다시 호출하여 모델이 처리 단계를 변경하거나 취소할 수 있도록 합니다. 콜백은 before_post_process
및 after_post_process
(각 첨부 파일 처리 전후에 호출됨)와 첨부 파일별 before_
및 after_
입니다. 콜백은 가능한 한 일반 ActiveRecord 콜백에 가깝도록 설계되었으므로 before_filter
에서 false를 반환하면(구체적으로 nil 반환은 동일하지 않음) 사후 처리 단계가 중단됩니다. after_filter
에서 false를 반환하면 아무것도 중단되지 않지만 필요한 경우 모델과 첨부 파일에 액세스할 수 있습니다.
참고: 유효성 검사에 따라 첨부 파일이 유효하지 않은 경우 사후 처리가 시작 되지 않습니다. 콜백과 프로세서는 유효한 첨부 파일이 있는 경우 에만 호출됩니다.
클래스 메시지 < ActiveRecord::Base has_attached_file :asset, 스타일: { Thumb: "100x100#" } before_post_process :skip_for_audio def skip_for_audio ! %w(오디오/ogg 애플리케이션/ogg).include?(asset_content_type) endend
Paperclip에는 공개적으로 사용 가능한 파일의 파일 이름을 난독화하기 위한 :hash
라는 보간법이 있습니다.
사용 예:
has_attached_file :avatar, { url: "/system/:hash.:extension", hash_secret: "longSecretString"}
:hash
보간은 :hash_data
에 지정된 내용으로 구성된 고유한 해시로 대체됩니다. :hash_data
의 기본값은 ":class/:attachment/:id/:style/:updated_at"
입니다.
:hash_secret
이 필요합니다. : :hash_secret
없이 :hash
사용하면 예외가 발생합니다.
이 기능에 대한 자세한 내용은 작성자의 설명을 읽어보세요.
지문이라는 속성이 있는 경우 할당된 원본 파일의 체크섬이 모델에 배치됩니다. 위의 사용자 모델 마이그레이션 예에 따른 마이그레이션은 다음과 같습니다.
class AddAvatarFingerprintColumnToUser < ActiveRecord::Migration def up add_column :users, :avatar_fingerprint, :string end def down Remove_column :users, :avatar_fingerprint endend
알고리즘은 구성 옵션을 사용하여 지정할 수 있습니다. Paperclip 5 및 이전 버전과의 하위 호환성을 위해 기본값은 MD5입니다.
has_attached_file :some_attachment, 어댑터_옵션: { hash_digest: 다이제스트::SHA256 }
데이터베이스의 지문을 업데이트하려면 기존 첨부 파일의 다이제스트를 변경한 후 CLASS=User ATTACHMENT=avatar rake paperclip:refresh:fingerprints
실행하세요.
일시 삭제된 모델을 원활하게 재생하기 위해 첨부 파일을 보존하는 옵션을 사용할 수 있습니다. (acts_as_paranoid, 편집증 등)
has_attached_file :some_attachment, { 보존_파일: true,}
이렇게 하면 모델이 파괴될 때 some_attachment
지워지는 것을 방지할 수 있으므로 나중에 객체를 복원할 때에도 여전히 존재하게 됩니다.
호출 가능한 객체(lambdas, Procs)는 Paperclip 전체의 동적 구성을 위해 여러 위치에서 사용될 수 있습니다. 이 전략은 라이브러리의 여러 구성 요소에 존재하지만 정의된 스타일과 프로세서를 모든 인스턴스에 적용하는 대신 사용자 정의 스타일과 프로세서를 특정 모델 인스턴스에 적용할 수 있다는 점에서 가장 중요합니다.
사용자의 역할에 따라 다양한 스타일을 가진 사용자 모델을 상상해 보세요. 아마도 일부 사용자는 보스일 수 있으며(예: 사용자 모델 인스턴스가 #boss?
에 응답함) 일반 사용자보다 더 큰 아바타 썸네일을 얻을 수 있습니다. 사용자 역할에 따라 사용할 스타일 매개변수를 결정하는 구성은 다음과 같을 수 있습니다. 여기서 상사는 300x300
썸네일을 받고 그렇지 않으면 100x100
썸네일이 생성됩니다.
클래스 사용자 < ActiveRecord::Base has_attached_file :avatar, 스타일: 람다 { |attachment| { 엄지손가락: (attachment.instance.boss? ? "300x300>" : "100x100>") } }end
또 다른 인위적인 예는 어떤 파일 프로세서가 적용되어야 하는지를 인식하는 사용자 모델입니다( :styles
정의될 때 호출되는 암시적인 thumbnail
프로세서를 넘어). 아마도 우리는 워터마크 프로세서를 사용할 수 있고 이는 특정 모델의 아바타에만 사용됩니다. 이에 대한 구성은 인스턴스에 어떤 프로세서를 적용해야 하는지 쿼리하는 위치일 수 있습니다. 아마도 일부 사용자는 해당 프로세서에 대해 [:thumbnail, :watermark]
반환할 수 있습니다. 여기서 정의된 watermark
프로세서는 Paperclip에 의해 이미 정의된 thumbnail
프로세서 다음에 호출됩니다.
클래스 사용자 < ActiveRecord::Base has_attached_file :avatar, 프로세서: 람다 { |instance| 인스턴스.프로세서 } attr_accessor :processorsend
기본적으로 Paperclip은 로거 수준에 따라 로깅을 출력합니다. 로깅을 비활성화하려면(예: 테스트 중) 환경 구성에 다음을 추가하세요.
Your::Application.configure do... Paperclip.options[:log] = false...end
rdocs의 추가 정보
Capistrano가 public/system
디렉토리를 심볼릭 링크하게 하여 새로운 배포 후에도 첨부 파일이 유지되도록 하려면 config/deploy.rb
파일에서 linked_dirs
옵션을 설정하십시오:
set :linked_dirs, fetch(:linked_dirs, []).push('공개/시스템')
Paperclip은 이전 배포에서 추가한 새로운 부착 스타일을 인식합니다. 각 배포 후에 해야 할 유일한 일은 rake paperclip:refresh:missing_styles
호출하는 것입니다. 기본적으로 RAILS_ROOT/public/system/paperclip_attachments.yml
에 현재 첨부 파일 스타일을 저장합니다. 다음 방법으로 변경할 수 있습니다.
Paperclip.registered_attachments_styles_path = '/tmp/config/paperclip_attachments.yml'
Capistrano의 예는 다음과 같습니다.
네임스페이스 :paperclip do desc "누락된 종이클립 스타일 빌드" 작업 :build_missing_styles 역할(:app)에서 수행 release_path 내에서 수행 Rails_env로 수행: fetch(:rails_env) do 실행 :rake, "paperclip:refresh:missing_styles" end end end endendafter( "배포:컴파일_자산", "종이클립:빌드_누락_스타일")
이제 새 스타일을 추가할 때마다 프로덕션에서 썸네일을 새로 고치는 것을 기억할 필요가 없습니다. 불행하게도 동적 스타일에서는 작동하지 않습니다. 단지 무시할 뿐입니다.
이미 작동 중인 앱이 있고 오래된 사진을 새로 고치는 rake paperclip:refresh:missing_styles
사용하지 않으려면 Paperclip에 기존 스타일을 알려야 합니다. 간단하게 paperclip_attachments.yml
파일을 직접 생성하세요. 예를 들어:
class User < ActiveRecord::Base has_attached_file :avatar, styles: { Thumb: 'x100', Croppable: '600x600>', big: '1000x1000>' }endclass Book < ActiveRecord::Base has_attached_file :cover, styles: { small: 'x100', 크게: '1000x1000>' } has_attached_file :sample, 스타일: { Thumb: 'x100' }end
그런 다음 RAILS_ROOT/public/system/paperclip_attachments.yml
에서 다음을 수행합니다.
---:사용자: :아바타: - :엄지손가락 - :자르기 가능 - :big:책: :표지: - :작은 - :대형 :샘플: - :엄지손가락
Paperclip은 첨부 파일 테스트를 위한 rspec 호환 매처를 제공합니다. 자세한 내용은 Paperclip::Shoulda::Matchers 문서를 참조하세요.
병렬 테스트
Paperclip 저장소의 기본 path
로 인해 테스트를 병렬로 실행하려고 하면 각 테스트 프로세스에서 동일한 경로가 계산되기 때문에 파일을 덮어쓰게 될 수 있습니다. 이 수정 사항은 parallel_tests에 적용되지만 테스트를 동시에 실행하기 위한 다른 메커니즘에도 비슷한 개념을 사용해야 합니다.
if ENV['PARALLEL_TEST_GROUPS'] Paperclip::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/#{ENV['TEST_ENV_NUMBER'].to_i}/:class/:attachment/:id_partition/ :filename"else Paperclip::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:filename"end
여기서 중요한 부분은 ENV['TEST_ENV_NUMBER']
또는 사용하는 병렬 테스트 라이브러리에 대한 유사한 메커니즘을 포함한다는 것입니다.
통합 테스트
FactoryBot과 통합 테스트를 사용하면 앱 내에 테스트 파일의 여러 복사본을 저장할 수 있습니다. 이를 방지하려면 다음과 같이 config/environments/test.rb
에 사용자 정의 경로를 지정하십시오.
Paperclip::Attachment.default_options[:path] = "#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension"
그런 다음 이를 spec_helper.rb
에 추가하여 테스트 스위트가 실행된 후 해당 디렉토리를 삭제하십시오.
config.after(:suite) do FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"])end
Factory Bot을 사용한 테스트 구성의 예
FactoryBot.define do Factory :user do Avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } endend
기능이나 버그 수정에 기여하고 싶다면: 감사합니다! 귀하의 수정 사항/기능이 포함될 가능성이 높은지 확인하려면 다음 지침을 읽어 보십시오.
끌어오기 요청을 게시하세요.
테스트가 있는지 확인하세요! 테스트되지 않은 패치는 허용되지 않습니다. 명시적인 테스트가 필요하지 않은 경우는 거의 없습니다. 클립에 대한 테스트 작성에 대한 질문이 있는 경우 GitHub 문제를 열어주세요.
테스트 기여 및 실행에 대한 자세한 내용은 CONTRIBUTING.md
참조하세요.
모든 기여자에게 감사드립니다!
Paperclip은 저작권 © 2008-2017 Thinkbot, Inc.입니다. 이는 무료 소프트웨어이며 MIT-LICENSE 파일에 지정된 조건에 따라 재배포될 수 있습니다.
Paperclip은 Thinkbot에 의해 유지 관리되고 자금이 지원됩니다. Thinkbot의 이름과 로고는 Thinkbot, Inc.의 상표입니다.
우리는 오픈 소스 소프트웨어를 좋아합니다! 당사의 다른 프로젝트를 확인하거나 당사를 고용하여 귀하의 제품을 설계, 개발 및 성장시키십시오.