-
Gradio 실전 시리즈 8화 – 업로드, 다운로드, 저장 경로 완벽 정리기술과 산업/AI 2025. 5. 21. 20:04728x90
Gradio에서 파일을 업로드하고 다운로드하는 방법을 정리합니다. 파일 타입 지정, 저장 경로 설정, 반환 파일 처리 등 실전 활용 중심으로 설명합니다.AI 모델이 실제로 활용되는 영역에서는 사용자 파일을 입력으로 받고, 가공한 결과물을 다시 사용자에게 제공해야 하는 경우가 많습니다.
예를 들어,
- PDF → 요약 결과 제공
- CSV 분석 후 리포트 파일 반환
- 이미지 변환 후 다운로드 기능 제공
이러한 파일 입출력 흐름을 Gradio에서 어떻게 처리할 수 있는지 구체적인 실습과 함께 알아보겠습니다.
파일 업로드 처리
1. gr.File() 기본 사용법
gr.File(file_types=[".txt", ".pdf"])
- 사용자가 파일을 업로드할 수 있는 UI 컴포넌트 생성
- 업로드된 파일은 temp 경로에 저장되며, filepath 형태로 함수에 전달됨
예제: 업로드한 텍스트 파일 내용 출력하기
import gradio as gr def read_file(file_obj): with open(file_obj.name, "r", encoding="utf-8") as f: return f.read() demo = gr.Interface( fn=read_file, inputs=gr.File(file_types=[".txt"], label="텍스트 파일 업로드"), outputs=gr.Textbox(label="내용 미리보기", lines=20) ) demo.launch()
설명
- file_obj.name은 임시 저장된 파일의 경로
- 사용자는 브라우저에서 파일을 올리기만 하면 자동으로 서버 측에서 파일을 읽어 처리 가능
파일 다운로드 제공하기
2. 출력으로 gr.File() 반환하기
def make_file(text): path = "output.txt" with open(path, "w", encoding="utf-8") as f: f.write(text) return path
gr.Interface( fn=make_file, inputs=gr.Textbox(label="내용 입력"), outputs=gr.File(label="다운로드 파일") ).launch()
결과
- 사용자가 입력한 텍스트가 output.txt로 저장되고,
- Gradio는 해당 파일을 다운로드 가능한 링크로 제공함
✅ 참고: 다운로드는 브라우저에서 동작하므로 서버 측 경로를 외부에 노출하지 않음
복수 파일 처리
gr.File(file_types=[".jpg"], file_count="multiple")
- 여러 이미지를 동시에 업로드 가능
- 함수에서는 List[file] 형태로 전달됨
예시: 이미지 여러 개 받아서 수량 반환
def count_images(files): return f"{len(files)}개의 이미지를 업로드했습니다." gr.Interface(fn=count_images, inputs=gr.File(file_count="multiple"), outputs="text").launch()
실전: 이미지 업로드 → 가공 → 다운로드 제공
from PIL import Image, ImageOps def process_image(file): image = Image.open(file.name).convert("RGB") result = ImageOps.invert(image) out_path = "result.jpg" result.save(out_path) return out_path gr.Interface( fn=process_image, inputs=gr.File(file_types=[".jpg", ".png"]), outputs=gr.File(label="변환 이미지 다운로드") ).launch()
업로드 파일 저장 위치 관리
기본적으로 Gradio는 파일을 **임시 디렉토리(temp dir)**에 저장합니다.
하지만 아래와 같이 저장 경로를 커스터마이징할 수 있습니다.import shutil def save_file(file): save_path = f"./uploads/{file.name.split('/')[-1]}" shutil.copyfile(file.name, save_path) return f"{save_path}에 저장되었습니다."
✅ 디렉토리 경로는 존재해야 하며, 존재하지 않으면 os.makedirs()로 생성 필요
실전 팁 요약
목적 컴포넌트 처리 방식
파일 업로드 gr.File() 파일 경로 전달 (file.name) 다중 파일 업로드 file_count="multiple" 리스트로 전달 텍스트 파일 미리보기 open(file.name).read() 인코딩 주의 이미지 저장 후 다운로드 PIL.Image.save() + 경로 반환 다운로드 링크 제공 출력으로 gr.File() 반환 사용자 업로드 저장 shutil.copyfile() 또는 os.rename()
마무리 – 입출력 경계는 ‘서비스화의 핵심’
파일 업로드와 다운로드는 AI 모델을 서비스로 전환할 때 가장 중요한 입출력 경계 설계입니다.
- 단순한 데모 단계에서는 Textbox, Image만으로도 충분하지만
- 실전 단계에서는 CSV, PDF, 이미지, 오디오 등 파일을 통한 입출력이 필수
Gradio는 이 모든 과정을 Python 코드 한두 줄로 해결할 수 있도록 설계돼 있어
빠르게 시제품을 만들고 반복 개선하는 데 최적의 도구입니다.다음 화에서는 지금까지 만든 Gradio 앱을 Hugging Face Spaces에 배포하는 실전 가이드를 다룹니다.
별도의 서버 없이도 누구나 Gradio 앱을 온라인에 공개하는 방법을 소개합니다.728x90'기술과 산업 > AI' 카테고리의 다른 글
LoRA 실무 적용 가이드 – Hugging Face 기반 활용법과 주의사항 (1) 2025.05.22 LoRA 거대 언어 모델을 가볍게 학습시키는 마법 같은 방법 (0) 2025.05.22 TaskMaster AI와 GitHub Projects 연동 – AI가 생성한 작업으로 협업 자동화하기 (0) 2025.05.21 TaskMaster AI – 개발자의 시간을 되돌려주는 AI 프로젝트 매니저 (1) 2025.05.21 머신러닝 알고리즘별 개념 비교 및 초보자용 설명 (1) 2025.05.21