ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Gradio 실전 시리즈 8화 – 업로드, 다운로드, 저장 경로 완벽 정리
    기술과 산업/AI 2025. 5. 21. 20:04
    728x90


    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
Designed by Tistory.