2011년 8월 5일 금요일

[Django] 파일 업로드 구현

Django로 구축한 서버에 파일 업로드 기능을 구현하는 방법에 대한 정리.

우선 기본적으로 django 매뉴얼에서도 파일 업로드에 대하여 서술하고 있다. 하지만 해당 페이지의 내용은 django 자체의 템플릿 기능을 이용하는데 한해서 설명하고 있는 터라 특정 상황에선 써 먹기 애매할 수도 있다. (예를 들어 Ajax 비동기 파일업로드 같은...)

완전히 수동으로 파일 업로드를 하는 경우를 구현해보자.

다음과 같은 HTML 폼이 있다.
<html> 
    <head><title>Upload Test</title></head> 
    <body> 
        <form action="/upload/"
              method="post"
              enctype="multipart/form-data"> 
            File:
            <input type="file"
                   name="file"
                   id="id_file" />
            <input type="submit" value="UPLOAD" /> 
        </form> 
    </body> 
</html> 
단순히 파일 하나 선택해서 UPLOAD 버튼을 누르면 /upload/ 라는 URL로 POST메시지로 파일을 전송하는 단순한 HTML 코드이다.

이 코드에 맞게 업로드가 되려면 Django에서 urls를 설정해서 /upload/가 들어올 경우 특정 view로 연결해야 하지만 이 부분은 생략한다.

여기서는 /upload/를 upload 라는 뷰로 연결했을 경우를 가정하여 코드를 구현하였다.
def upload(req):
    if req.method == 'POST':
        if 'file' in req.FILES:
            file = req.FILES['file']
            filename = file._name

            fp = open('%s/%s' % (UPLOAD_DIR, filename) , 'wb')
            for chunk in file.chunks():
                fp.write(chunk)
            fp.close()
            return HttpResponse('File Uploaded')
    return HttpResponse('Failed to Upload File')
UPLOAD_DIR은 임의로 디렉토리를 지정하도록 해야 할 것이다.

코드 내용 상 파악이 가능하겠지만, req(HttpRequest) 오브젝트 내부에 FILES라는 멤버에 업로드된 파일 정보가 넘어오게 된다. 이 정보를 이용해 실제 내용을 파일로 써 넣으면 된다.

빼먹었지만, Unix류가 아닌 운영체제를 위해서 UPLOAD_DIR과 filename을 이용해 파일의 전체 경로를 만들 때는 os.path.join을 이용해서 경로를 만드는 것도 좋은 방법일 것이다.

댓글 1개 :

김회준 :

Thank you !!!! Thank you !!!! !!!!!! >_ <