djangoアップロードファイル

9870 ワード

template html(テンプレートファイル):
<form enctype="multipart/form-data" method="POST" action="/address/upload/"> 
   <input type="file" name="file" />
   <br /> 
   <input type="submit" value="    " /> 
</form>

 
次のformがあります.
from django import forms

class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

このformを処理するビューにはrequest.FILESのファイルデータが受信されます.上記formからのデータはrequest.FILES['file']でアクセスできます.特に、requestメソッドがPOSTであり、requestを送信する
に属性enctype="multipart/form-data"がある場合にのみ、request.FILESにファイルデータが含まれます.そうしないとrequest.FILESは空になります.
次のビュー関数:
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from somewhere import handle_uploader_file

def upload_file(request):
  if request.method == 'POST':
     form = UploadFileForm(request.POST, request.FILES)
     if form.is_valid():
        handle_uploaded_file(request.FILES['file'])
        return HttpResponseRedirect('/success/url')
  else:
     form = UploadFileForm()
  return render_to_response('upload.html', {'form': form})

ファイルデータをformにバインドするには、request.FILESをformのコンストラクション関数に渡す必要があります.
アップロードされたファイル辞書request.FILESを処理する各エントリは、UploadFileオブジェクトです.UploadFileオブジェクトには、1、UploadFile.read()という方法があります.ファイルからすべてのアップロードデータを読み込みます.アップロードファイルが大きすぎると、メモリが消費される可能性があります.慎重に使用してください.2、UploadFile.multiple_chunks():アップロードファイルが十分大きい場合、複数の部分に分けて読み込む場合はTrue.デフォルトで、アップロードファイルが2.5 Mより大きい場合はTrueを返します.しかし、この値は構成できます.3、UploadFile.chunks():ファイルをアップロードするブロックジェネレータを返します.Multipleのようにchunks()はTrueを返し、read()の代わりにchrunks()をループで使用する必要があります.一般的にはchunks()をそのまま使えばいいです.4、UploadFile.name():アップロードファイルのファイル名5、UplodFile.size():アップロードファイルのファイルサイズ(バイト)上記の説明でhandle_を書くことができますuploaded_file関数
def handle_uploaded_file(f):
    destination = open('some/file/name.txt', 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

詳細:
def handle_uploaded_file(f):
    file_name = ""

    try:
        path = "media/editor" + time.strftime('/%Y/%m/%d/%H/%M/%S/')
        if not os.path.exists(path):
            os.makedirs(path)
            file_name = path + f.name
            destination = open(file_name, 'wb+')
            for chunk in f.chunks():
                destination.write(chunk)
            destination.close()
    except Exception, e:
        print e

    return file_name

 
アップロードファイルが保存されている場所アップロードファイルを保存する前に、データをある場所に保存する必要があります.デフォルトでは、アップロードファイルが2.5 M未満の場合、djangoはアップロードファイルのすべての内容をメモリに読み込みます.ファイルを保存するには、メモリから読み取り、書き込みが1回しかないことを意味します.しかし、アップロードファイルが大きい場合、djangoはアップロードファイルを一時ファイルに書き込み、システムの一時フォルダに保存します.
upload handlerの動作を変更する3つの設定djangoファイルのアップロードを制御する動作:FILE_UPLOAD_MAX_MEMORY_SIZE:メモリを直接読み込む最大アップロードファイルサイズ(バイト数).この値より大きい場合、ファイルはディスクに保存されます.デフォルト2.5 MバイトFILE_UPLOAD_TEMP_DIRFILE_UPLOAD_PERMISSIONS:権限FILE_UPLOAD_HANDLERSはファイルの本当のプロセッサをアップロードします.この設定を変更すると、djangoアップロードファイルをカスタマイズするプロセスが完了します.デフォルトは次のとおりです.
("django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",)

まずメモリを読み込み、できない場合は一時ファイルに保存してみます.
アップロードファイルのカプセル化方法:
'''    '''
def handle_uploaded_file(f):
    file_name = ""

    try:
        path = "media/image" + time.strftime('/%Y/%m/%d/%H/%M/%S/')
        if not os.path.exists(path):
            os.makedirs(path)
            file_name = path + f.name
            destination = open(file_name, 'wb+')
            for chunk in f.chunks():
                destination.write(chunk)
            destination.close()
    except Exception, e:
        print e

    return file_name