The Boxer
[Django] Image Upload 본문
728x90
반응형
django를 사용하여 image upload 구현
필요 설치모듈: pillow
pip install pillow
I. 설정
(1) 파일 업로드용 url 경로 설정
- django는 이미지등의 정적 파일들을 media라는 폴더에 저장하고 관리
- django에서 어디에 media폴더가 있는지 알려주어야함
settings.py
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 이미지가 저장될 경로를 설정
- MEDIA_URL: 이미지가 저장된 경로를 url에서 표현
- MEDIA_ROOT: 실제 이미지가 저장된 경로
urls.py
from django.conf.urls.static import static from django.conf import settings urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_URL)
- urls.py의 urlpatterns에 이미지로 접근하는 주소를 추가
- static(통과시키는 url, document_root=실제 연결할 저장장소)
- django.conf
- django의 설정에 관한 모든 함수의 모임
- django는 파일을 통해 데이터로 직접 접근하는 방식을 지양한다
- 데이터 은닉화: django.conf의 함수, 클래스를 통해 간접적으로 데이터에 접근
- 직접접근시, 추후에 데이터 수정등이 발생하면, 일일이 모든 코드를 수정해야 하는 상황이 발생
II. ImageField
- django-orm에서 지원하는 이미지 저장 속성
- 업로드된 파일을 media폴더에 저장하고 해당 주소를 DB에 저장
설정 예시
image = models.ImageField(blank=True, upload_to='postings/%Y%M%d')
- blank=True: 이미지가 업로드되지 않아도 에러발생하지 않음
- upload_to: 이미지가 저장될 디렉토리
(1) Image Processed Field
- 속도상, 용량상의 이유로 항상 원본파일을 저장하고, 보낼 수 없다
- 따라서 크기를 조절한 후 보여주기용 이미지를 저장하고, 보냄
- django에서 제공하는 image processed field를 사용하여 크기가 조정된 사진을 저장
- 설치모듈
- django-imagekit(imagekit 아님): django용 이미지 처리 모듈
모델 적용 예시
from imagekit.models import ProcessedImageField, ImageSpecField from imagekit.processors import ResizeToFit class Posting(models.Model): content = models.TextField(default='') icon = models.CharField(max_length=20, default='') # Save as origin # image = models.ImageField(blank=True, upload_to='postings/%Y%M%d') # Save resized version image = ProcessedImageField( upload_to='postings/resize/%Y%m%d', processors=[ResizeToFit(width=960, upscale=False)], format='JPEG' ) image_thumbnail = ImageSpecField( source='image', processors=[ResizeToFit(width=320, upscale=False)], format='JPEG', options={'quality': 60} )
- ProcessedImageField: django-orm이 인식하는 처리된 이미지 속성. image필드와 마찬가지로, 이미지가 저장된 위치를 DB에 저장
- Processor: 이미치 처리를 진행하는 인자
- ResizeToFit: 설정함 값에 따라 이미지 크기 조정
- upscale: 크기가 작은 이미지를 크게 만드는 경우
- image는 이미지 객체를 담고 있다. image.url을 통해 이미지의 경로에 접근
- ImageSpecField: 이미 생성된 이미지의 캐시용 이미지를 생성
- source: 캐싱할 원본 이미지를 지정
- cache: 요청할 때 최초 생성
(2) html문서에서 이미지 전달
- 원래 http에서는 사진을 저장하는 기능이 없었으며, 나중에 기능을 추가
- http에서 파일을 보내는 것은 html문서를 보내는 것과 다른 방식을 사용하기 때문에, html문서에 이를 명시해야 한다
form tag에서 명시
<form method="POST" enctype="multipart/form-data">
728x90
반응형
'Django' 카테고리의 다른 글
[Django] 계정정보 수정, 비밀번호 변경 (0) | 2019.04.18 |
---|---|
[Django] M : N Relation 구현 (0) | 2019.04.12 |
[Django] 계정 생성, 로그인, 로그아웃 (0) | 2019.04.12 |
[Django] Model Form (0) | 2019.04.10 |
Comments