Streamlit - 이미지 파일 GitHub에 업로드 하기

반응형

이 글은 Python 언어와 Visual Studio Code, GitHub Desktop을 기반으로 작성되었습니다.

웹 대시보드를 이용하여 이미지 파일 업로드 하기

업로드 서버는 GitHub이므로 저는 GitHub과 연동되어 있는 상태에서 진행하였습니다.

과정을 확인하면서 봐야 이해가 쉬우므로 한단계씩 진행하겠습니다.

파일 이름의 중복이 있을 수 있으므로 저장은 현재 시간을 기준으로 저장하는 것으로 진행하겠습니다.


파일 업로드 함수

  • .file_uploader('보여줄 메시지', tytpe= '업로드파일 확장자')
    • 여러 파일을 업로드 하려면?
      • 옵션 > accept_multiple_files=True로 하면 여러 파일을 업로드 할 수 있습니다.
    • 예시) 사진 파일(jpg/png/jpeg) 업로드하기 
      • 업로드를 할 수 있게 해주는 기능이 사용자에게 나타납니다.
      • 이 기능은 실제로 업로드가 되지 않습니다.
      • 업로드한 파일의 정보를 담고 있으며 이 정보를 이용해 업로드를 진행해야합니다.

 

  • 소스 코드
upload_file = st.file_uploader('이미지 파일 선택', type=['jpg', 'png', 'jpeg'])

 

  • 결과 화면


파일이름 정의하기

  • file_uploader함수를 사용한다고해서 업로드가 되지 않는다고 하였습니다.
  • 하지만 업로드 파일의 정보를 갖고 있으며, 이를 저장하기 위한 파일의 제목을 정해야 합니다.
    • 예시) 파일 이름 중복이 없게 시간순으로 재정의하기
      • 파이썬 datetime 함수를 이용하여 정의합니다.
      • 여기서 다루는 것은 파이썬이 아니기 때문에 자세한 설명은 파이썬 카테고리를 확인해주세요.

 

  • 소스 코드
current_time = datetime.now()
# 현재 시간 저장
upload_file.name = current_time.isoformat().replace(':', '_') + '.jpg'
# 현재 시간으로 jpg 파일 이름 생성

 

  • 실행 화면
    • 변수에 저장하는 것이기 때문에 실행 화면이 따로 없습니다.
    • 다만 이를 이용해 파일 제목으로 할 것이기 때문에 다음 절차에서 확인하도록 합시다.

파일 불러오기/저장 함수

  • .open(파일이름, 모드)
  • .write(경로와 파일이름)
  • .close()
    • 파일을 확인하고 저장하는 과정
    • open의 모드에 따라 함수의 수행 방법이 달라집니다.
      • 업로드 파일을 가져오고 서버에 저장을 할 예정이기 때문에 wb(쓰기)를 사용
      • with를 사용해 close()를 사용할 필요가 없습니다.
        • with : 생성과 소멸을 자동적으로 해주는 역할
      • getbuffer를 활용해 파일의 크기를 확인하고 알아서 저장하게 합니다.
        • 주의 사항 : getbuffer에는 반드시 파일의 데이터를 가지고 있는 변수여야 합니다.

 

  • 예시) 파일 이름을 현재 시간을 기준으로 저장(업로드)하기
    • 현재 시간은 이전의 파트에서 다뤘기 때문에 사용하는 현재의 변수는
      '저장 될 이름' 과 '파일의 정보' 가 각각 담겨 있습니다. 꼭 확인!!!
  • 소스 코드
# 파일 쓰기(저장), 성공시 안내 문구 출력
with open(upload_file.name, 'wb') as f :
    f.write(upload_file.getbuffer())
    st.success("Saved file : {}".format(upload_file.name))

 

  • 실행 화면
    • 이미지 업로드

 

  • 현재 시각을 기준으로 업로드 확인


전체 소스 코드

import streamlit as st
import os
from datetime import datetime

def main() :
    st.title('이미지 파일 업로드')
    upload_file = st.file_uploader('이미지 파일 선택', type=['jpg', 'png', 'jpeg'])
    # 이미지 업로더, 이미지 파일만 업로드하게 설정

    current_time = datetime.now()
    upload_file.name = current_time.isoformat().replace(':', '_') + '.jpg'
    # 지금 시간을 기준으로 업로드 파일 이름 설정

    with open(upload_file.name, 'wb') as f :
        f.write(upload_file.getbuffer())
        st.success("Saved file : {}".format(upload_file.name))
    # 파일 생성

if __name__ == '__main__' :
    main()
반응형