Django File Upload

황동준·2021년 1월 31일
0
<form method="post" class="post-form my-3" enctype="multipart/form-data">
  ...
  <div class="form-group">
     <label for="song_file">Song File</label>
     <input type="file" class="form-control" name="song_file" id="song_file"
        value="{{ form.song_file.value|default_if_none:'' }}">
  </div>
</form>

enctype을 꼭 "multipart/form-data"로 설정해야 하는데, 이 의미는 form에서 받는 모든 정보를 모두 인코딩하지는 않는다는 뜻이다. file은 인코딩하면 file로 쓸 수 없기 때문.

프런트에는 이정도 추가해 주고,

views.py

def record_create(request):
    if request.method == 'POST':
        form = RecordForm(request.POST, request.FILES)
        if form.is_valid():
            record = form.save(commit=False)#save just temporary
            record.artist = request.user
            record.save()
            #name = record.song_file.name.split('/')[1]
            #name = os.path.basename(record.song_file.name)
            #handle_uploaded_file(request.FILES['song_file'], name)
            return redirect('post:index')
    else:
        form = RecordForm()
    form = {'form': form }
    return render(request, 'post/record_create.html', form)

이런 식으로, request.FILES를 꼭 form에 넘겨주어야 한다. 그렇지 않으면 file을 저장할 수 없게 된다. file을 upload 하기 위해서는 꼭 POST method일 때 해야 한다는 것에 유의하자.

만약 큰 파일을 나눠서 저장하기 위해서는 아래의 handle_uploaded_file function을 이용해야 하는데, 저자는 이걸 이용하다가 자꾸 오류가 나서 그냥 나중에 에러 생기면 이용해보기로 하였다.

views.py

def handle_uploaded_file(f, name):
    with open(settings.MEDIA_URL+"musics/"+name, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)
            
profile
부담없이 기록하기

0개의 댓글