[uscript] 8장. file upload/download 구현
다운로드와 업로드 구현은 request, response 객체에 정보를 읽거나 넣어주면 구현이 가능하다.
다운로드 구현은 아래와 같이 스크립트의 객체를 얻어와 본문에 있는 내용을 한글로 인코딩하여 첨부 파일 형태로 다운로드 되게 하였다.
제목은 파일의 이름으로 하고 내용은 response header에 content-disposition에 attachment 형태로 파일헤더를 추가하고 내용을 response.write로 출력을 하면 된다.
크롬에서는 다운로드 폴더로 내려오고 IE 에서는 파일창으로 열기 또는 저장 메세지 창이 뜬다.
업로드 구현은 찾는데 조금 고생을 하였는데 post 형식으로 파일을 전달시 장고에서 csrf에 대한 보호모드를 적용해야 되서 아래와 같이 @csrf_exempt 와 @csrf_protect 데코레이터 함수로 구현을 한다.
로그인 사용자만 업로드할 수 있게 login_required 함수도 같이 적용하였다.
업로드는 UploadFileForm이라는 Form 클래스로 화면을 구현하고 화면의 form이 유효한 화면이면 업로드를 하고 그렇지 않으면 다시 업로드 화면으로 돌아간다.
업로드 폼은 간단하고 Form을 상속받아 파일 필드를 가지는 폼으로 만들었다.
파이썬 업로드 구현시 handle_upload_file 함수에서 file에 정보를 read 함수로 읽는것보다 chunks 로 읽는게 안정적이라고 해서 구현하였고 간단한 파일의 경우에는 read와 별로 다르지는 않는것 같다. chunks 함수에서 읽어들인만큼 contents 변수에 붙이고 scripts 객체를 생성한다.
다운로드 구현은 아래와 같이 스크립트의 객체를 얻어와 본문에 있는 내용을 한글로 인코딩하여 첨부 파일 형태로 다운로드 되게 하였다.
제목은 파일의 이름으로 하고 내용은 response header에 content-disposition에 attachment 형태로 파일헤더를 추가하고 내용을 response.write로 출력을 하면 된다.
크롬에서는 다운로드 폴더로 내려오고 IE 에서는 파일창으로 열기 또는 저장 메세지 창이 뜬다.
def scripts_download(request, scripts_id): scripts = get_object_or_404(Scripts, id=scripts_id) title = scripts.title.encode('euc-kr') response = HttpResponse(content_type='plain/text') response['Content-Disposition'] = 'attachment; filename=' + title response.write(scripts.contents.encode('euc-kr')) return response
업로드 구현은 찾는데 조금 고생을 하였는데 post 형식으로 파일을 전달시 장고에서 csrf에 대한 보호모드를 적용해야 되서 아래와 같이 @csrf_exempt 와 @csrf_protect 데코레이터 함수로 구현을 한다.
로그인 사용자만 업로드할 수 있게 login_required 함수도 같이 적용하였다.
업로드는 UploadFileForm이라는 Form 클래스로 화면을 구현하고 화면의 form이 유효한 화면이면 업로드를 하고 그렇지 않으면 다시 업로드 화면으로 돌아간다.
업로드 폼은 간단하고 Form을 상속받아 파일 필드를 가지는 폼으로 만들었다.
@login_required(login_url=login_url) class UploadFileForm(forms.Form): file = forms.FileField() @csrf_exempt def upload_view(request): if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): handle_uploaded_file(request, request.FILES['file']) return HttpResponseRedirect('/scripts/') else: form = UploadFileForm() return render_to_response('scripts/upload.html', RequestContext(request, {'form': form})) @csrf_protect def handle_uploaded_file(request, f): contents = "" print f.charset for chunk in f.chunks(): contents = contents + chunk.decode('euc-kr') scripts, dummy = Scripts.objects.get_or_create( title=f.name, user=request.user, contents=contents)
파이썬 업로드 구현시 handle_upload_file 함수에서 file에 정보를 read 함수로 읽는것보다 chunks 로 읽는게 안정적이라고 해서 구현하였고 간단한 파일의 경우에는 read와 별로 다르지는 않는것 같다. chunks 함수에서 읽어들인만큼 contents 변수에 붙이고 scripts 객체를 생성한다.
댓글
댓글 쓰기