Uaslódálacha ComhadLink to this heading
Nuair a láimhseálann Django uaslódáil comhad, críochnaíonn sonraí </ref/request-response> <django.http.HttpRequest.FILES>na gcomhad cuirtear in:attr: `request.files `(le haghaidh tuilleadh eolais ar an réad ``iarraidh ``féach an doiciméadú le haghaidh: doc: `earraí iarratais agus freagartha'). Míníonn an doiciméad seo conas a stóráiltear comhaid ar dhiosca agus i gcuimhne, agus conas an t-iompar réamhshocraithe a shain
Uaslódálacha comhaid bunúsachaLink to this heading
Smaoinigh ar fhoirm ina bhfuil a:class: ~django.forms.filefield:
foirme.pyfrom django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
Gheobhaidh amharc ag láimhseáil an fhoirm seo na sonraí comhad in:attr: Request.File`<django.http.HttpRequest.FILES>, ar foclóir é ina bhfuil eochair do gach ceach:class: `~django.forms.filefield (nó:class: ~django.forms.imagefield nó eile:class: ~django.forms.filefield) sa fhoirm. Mar sin bheadh na sonraí ón bhfoirm thuas inrochtana mar ``request.files ['file'] ``.
<form>Tabhair faoi deara nach m <django.http.HttpRequest.FILES>beidh sonraí: attr: Request.files `ach mura raibh an modh iarratais ``POST `, cuireadh réimse comhad amháin ar a laghad a phostáil i ndáiríre, agus tá an tréith enctype="multipart/form-data" ag an`` a chuir an iarraidh. Seachas sin, beidh ``request.files folamh.
An chuid is mó den am, cuirfidh tú na sonraí comhad ó request isteach sa fhoirm mar a thuairiscítear in:ref: binding-uploaded-files. Bheadh cuma rud éigin air seo:
views.pyfrom django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_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(request, "upload.html", {"form": form})
Tabhair faoi deara go gcaithfimid: attr: `Request.files <django.http.HttpRequest.FILES>`a chur isteach i dtógálaí na foirme; seo mar a chuirtear sonraí comhad ceangailte i bhfoirm.
Seo bealach coitianta a d'fhéadfá comhad uaslódáilte a láimhseáil:
def handle_uploaded_file(f):
with open("some/file/name.txt", "wb+") as destination:
for chunk in f.chunks():
destination.write(chunk)
Cinntíonn lupáil thar uploadedfile.chunks () ``in ionad ``read () a úsáid nach gcuireann comhaid mhóra cuimhne do chórais a shárú.
Tá cúpla modh agus tréithe eile ar fáil ar rudaí uploadedfile; féach:class: UploadedFile le haghaidh tagartha iomlán.
Comhaid uaslódáilte a láimhseáilLink to this heading
Má tá comhad á shábháil agat ar a:class: ~django.db.models.model le a:class: ~django.db.models.filefield, déanann an próiseas seo i bhfad níos éasca ag baint úsáide as a:class: ~django.forms.ModelForm. Sábhálfar réad an chomhaid chuig an suíomh a shonraítear leis an:attr: ~django.db.models.filefield.upload_to argóint an chomhfhreagraí:class: ~django.db.models.filefield nuair a ghlaoch ``form.save () ``:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField
def upload_file(request):
if request.method == "POST":
form = ModelFormWithFileField(request.POST, request.FILES)
if form.is_valid():
# file is saved
form.save()
return HttpResponseRedirect("/success/url/")
else:
form = ModelFormWithFileField()
return render(request, "upload.html", {"form": form})
Má tá réad á thógáil agat de láimh, is féidir leat an réad comhaid a shannadh ó:attr: `request.files <django.http.HttpRequest.FILES>`chuig an réimse comhaid sa tsamhail:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField
def upload_file(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
instance = ModelWithFileField(file_field=request.FILES["file"])
instance.save()
return HttpResponseRedirect("/success/url/")
else:
form = UploadFileForm()
return render(request, "upload.html", {"form": form})
Má tá réad á thógáil agat de láimh lasmuigh d'iarratas, is féidir leat a:class: ~django.core.files.file cosúil le réad a shannadh chuig an:class: ~django.db.models.filefield:
from django.core.management.base import BaseCommand
from django.core.files.base import ContentFile
class MyCommand(BaseCommand):
def handle(self, *args, **options):
content_file = ContentFile(b"Hello world!", name="hello-world.txt")
instance = ModelWithFileField(file_field=content_file)
instance.save()
Comhad iolracha a uaslódáilLink to this heading
Más mian leat comhad iolracha a uaslódáil ag baint úsáide as réimse foirme amháin, cruthaigh fo-aicme de ghuirléid an réimse agus socraigh a tréith aicme allow_multiple_selected go True.
Ionas go mbeidh comhaid den sórt sin go léir a bhailíochtú ag d'fhoirm (agus go mbeidh luach an réimse iad go léir san áireamh), beidh ort fo-aicme “FileField” a dhéanamh freisin. Féach thíos le haghaidh sampla.
foirme.pyfrom django import forms
class MultipleFileInput(forms.ClearableFileInput):
allow_multiple_selected = True
class MultipleFileField(forms.FileField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("widget", MultipleFileInput())
super().__init__(*args, **kwargs)
def clean(self, data, initial=None):
single_file_clean = super().clean
if isinstance(data, (list, tuple)):
result = [single_file_clean(d, initial) for d in data]
else:
result = [single_file_clean(data, initial)]
return result
class FileFieldForm(forms.Form):
file_field = MultipleFileField()
Ansin athraigh an modh ``form_valid () ``de d':class: ~django.views.generic.edit.formView chun uaslódálacha comhad iolracha a láimhseáil:
views.pyfrom django.views.generic.edit import FormView
from .forms import FileFieldForm
class FileFieldFormView(FormView):
form_class = FileFieldForm
template_name = "upload.html" # Replace with your template.
success_url = "..." # Replace with your URL or reverse().
def form_valid(self, form):
files = form.cleaned_data["file_field"]
for f in files:
... # Do something with each file.
return super().form_valid(form)
Uaslódáil HandlersLink to this heading
Nuair a uaslódálann úsáideoir comhad, cuireann Django sonraí na gcomhad chuig*láimhseálaí uaslódálaí* - rang beag a láimhseálann sonraí comhaid de réir mar a uaslódáltar iad. Sainmhínítear láimhseálaithe uaslódála ar dtús sa socrú:setting: FILE_UPLOAD_HANDLERS, a réamhshocraíonn:
[
"django.core.files.uploadhandler.MemoryFileUploadHandler",
"django.core.files.uploadhandler.TemporaryFileUploadHandler",
]
Le chéile: Class: MemoryFileUploadHandler agus: class: TemporaryFileUploadHandler soláthraíonn iompar uaslódála comhaid réamhshocraithe Django maidir le comhaid bheaga a léamh isteach i gcuimhne agus cinn mhóra ar an diosca.
Is féidir leat láimhseálaithe saincheaptha a scríobh a shaincheapann an chaoi a láimhseálann D'fhéadfá, mar shampla, láimhseálaithe saincheaptha a úsáid chun cuótaí ar leibhéal an úsáideora a fhorfheidhmiú, sonraí a chomhbhrú ar an eitilt, barraí dul chun cinn a léiriú, agus fiú sonraí a sheoladh chuig áit stórála eile go díreach gan Féach: ref: custom_upload_handlers le haghaidh sonraí maidir le conas is féidir leat iompar uaslódála a shaincheapadh nó a athsholáthar go hiomlán.
Nuair a stóráiltear sonraí uaslódáLink to this heading
Sula sábhálann tú comhaid uaslódáilte, ní mór na sonraí a stóráil áit éigin.
De réir réamhshocraithe, má tá comhad uaslódáilte níos lú ná 2.5 meigabyte, coinneoidh Django ábhar iomlán an uaslódála i gcuimhne. Ciallaíonn sé seo nach mbíonn ach léamh ón gcuimhne agus scríobh chuig diosca i gceist leis an gcomhad a shábháil agus dá bhrí sin tá sé an-tapa.
Mar sin féin, má tá comhad uaslódáilte ró-mhór, scríobhfaidh Django an comhad uaslódáilte chuig comhad sealadach atá stóráilte in eolaire sealadach do chórais. Ar ardán cosúil le Unix ciallaíonn sé seo gur féidir leat a bheith ag súil go nginfidh Django comhad ar a dtugtar rud éigin cosúil le /tmpzfp6i6.upload. Má tá uaslódáil mór go leor, is féidir leat féachaint ar an gcomhad seo ag fás i méid de réir mar a shruthlaíonn Django na sonraí ar an diosca.
Is “réamhshocruithe réasúnacha” iad na sonraíochtaí seo - 2.5 meigabyte; /tmp; srl. - is féidir iad a shaincheapadh mar a thuairiscítear sa chéad chuid eile.
Iompar láimhseála uaslódálaLink to this heading
Tá cúpla socrú ann a rialaíonn iompar uaslódála comhad Django. Féach: Ref: `Socruithe Uaslódála Comhad <file-upload-settings>`le haghaidh sonraí.
Láimhseálóirí uaslódála a mhodhnúLink to this heading
Uaireanta teastaíonn iompar uaslódála éagsúla Sna cásanna seo, is féidir leat láimhseálaithe uaslódála a shárú ar bhonn in aghaidh iarratais trí ``request.upload_handlers` a mhodhnú. De réir réamhshocraithe, beidh na láimhseálaithe uaslódála a thugtar ar:setting: FILE_UPLOAD_HANDLERS sa liosta seo, ach is féidir leat an liosta a mhodhnú mar a dhéanfá aon liosta eile.
Mar shampla, cuir i gcás go bhfuil “ProgressbarUploadHandler” scríofa agat a sholáthraíonn aiseolas ar dhul chun cinn a uaslódáil chuig cineál éigin giuirléid AJAX. Chuirfeá an láimhseálaí seo le do láimhseálaithe uaslódála mar seo:
request.upload_handlers.insert(0, ProgressBarUploadHandler(request))
Using list.insert(), as shown above, ensures that the progress bar handler
is placed at the beginning of the list. Since upload handlers are executed in
order, this placement guarantees that the progress bar handler runs before the
default handlers, allowing it to track progress across the entire upload.
Más mian leat na láimhseálaithe uaslódála a chur in ionad go hiomlán, is féidir leat liosta nua a shannadh:
request.upload_handlers = [ProgressBarUploadHandler(request)]