The Boxer

[Django] Image Upload 본문

Django

[Django] Image Upload

Prower 2019. 4. 11. 19:41
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