우선 기본적으로 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을 이용해서 경로를 만드는 것도 좋은 방법일 것이다.
Thank you !!!! Thank you !!!! !!!!!! >_ <
답글삭제