ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTML file upload시 파일 내용이 없는 문제
    html+css 2016. 11. 12. 00:01

    HTML form에서 file type input을 이용해서 파일을 업로드했음에도 불구하고 백엔드에서 파일의 내용을 불러오지 못하는 경우가 있다.

    코드를 보자


    참고로 본 포스트에서 사용되는 환경은 아래와 같으며:

    macOS Sierra

    python3.5.1 + Django 1.10.3

    HTML5


    해당 문제는 HTML에서 발생하므로 백엔드로 django를 쓰던 flask를 쓰던 rails나 php를 뜨던 심지어 듣보잡 프레임워크를 쓰던 프레임워크는 개나줘버리고 raw jsp와 같이 작업하던 전혀 문제가 되지 않는다.

    저런 개발환경을 쓴 이유는 그냥 내 컴퓨터가 맥북이고 django가 익숙해서 그렇다.

    그냥 참고용으로만 남겨놓으니 자신이 어떤 상황에서 개발을 하더라도 상관 없다.


    views.py : View (MVC에서 Control 부분 - Django에서는 MTV라고 부름)


    templates/index.html : Template (MVC에서 View 부분)


    자 이제 서버를 돌리고 실행을 해보자

    django에서는 python manage.py runserver 0.0.0.0:8080으로 8080 포트를 통해 테스트 서버를 열 수 있다


    파일을 첨부하고 제출하면?

    POST에 파일명이 들어가고, 정작 중요한 FILES로는 아무런 데이터도 들어오지 않았다!


    앞서 말했지만 이 원인은 HTML form에 있다.

    form 코드를 보자


    form 선언시 action으로 request를 보낼 URL과 method를 지정했다.

    문제는 파일 업로드는 여기에 하나 더 옵션을 추가해야한다는 점이다

    enctype="multipart/form-data"

    옵션도 같이줘야하는데, form method 지정 바로 뒤에 위 옵션도 추가해서 다시 서버를 돌려보자



    페이지를 새로고침 한 후 파일을 다시 업로드하면

    이제 FILES로 데이터가 잘 들어옴을 알 수 있다.

    Django라면 request.FILES['upload_files']를 이용하여 FileField()에 넣는다거나 하는 과정을 진행할 수 있게 되었다. 



    혹시나 글만으로 이해가 안되시는 분들을 위해 참고하시라고 github에 업로드한 링크를 달아놓는다.

    코드에 버그가 있지 않는 이상 별도의 README.md는 올려놓지 않을 예졍이므로 궁금한점은 blinglnav at gmail.com로 보내주면 확인하겠다. 

    (mac이 아닌 다른 환경에서 실행할때는 local python으로 실행하거나 virtualenv를 다시 설정해야 할 것이다.)


    https://github.com/blinglnav/study-file-uploader


    댓글

Designed by Tistory.