745 Stimmen

Wie lädt man eine Datei in Django hoch?

Als Neuling in Django habe ich Schwierigkeiten, eine Upload-App in Django 1.3 zu erstellen. Ich konnte keine aktuellen Beispiele/Snippets finden. Kann jemand eine minimale, aber vollständige (Model, View, Template) Beispielcode, dies zu tun posten?

17voto

Imran Punkte 81131

Erweitert um Heinrichs Beispiel :

import tempfile
import shutil

FILE_UPLOAD_DIR = '/home/imran/uploads'

def handle_uploaded_file(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
    return filepath

Sie können dies als handle_uploaded_file aus Ihrer Ansicht mit dem hochgeladenen Dateiobjekt. Diese speichert die Datei unter einem eindeutigen Namen (mit vorangestelltem Dateinamen der ursprünglich hochgeladenen Datei) im Dateisystem und gibt den vollständigen Pfad der gespeicherten Datei zurück. Sie können den Pfad in der Datenbank speichern und später etwas mit der Datei machen.

0 Stimmen

Imran, ich habe Ihren Code in meiner Ansicht ausprobiert, aber folgende Fehlermeldung erhalten: Das Objekt "WSGIRequest" hat kein Attribut "name".

2 Stimmen

Übergeben Sie das hochgeladene Dateiobjekt ( request.FILES['myfile'] ) an handle_uploaded_file , nicht die request selbst.

0 Stimmen

Kann ich sie direkt in der Datenbank speichern? stackoverflow.com/questions/24705246/

13voto

Vijesh Venugopal Punkte 1541

Hier kann es Ihnen helfen: Erstellen Sie ein Dateifeld in Ihrer models.py

Zum Hochladen der Datei (in Ihrer admin.py):

def save_model(self, request, obj, form, change):
    url = "http://img.youtube.com/vi/%s/hqdefault.jpg" %(obj.video)
    url = str(url)

    if url:
        temp_img = NamedTemporaryFile(delete=True)
        temp_img.write(urllib2.urlopen(url).read())
        temp_img.flush()
        filename_img = urlparse(url).path.split('/')[-1]
        obj.image.save(filename_img,File(temp_img)

und verwenden Sie dieses Feld auch in Ihrer Vorlage.

1 Stimmen

Dies ist nützlich, wenn Sie Dateien, die Sie speichern möchten, manuell einstellen müssen. In diesem Fall können Sie diesen Abschnitt ebenfalls benötigen: docs.djangoproject.com/de/dev/topics/files/#the-file-object

0 Stimmen

Das ist sehr nützlich, und es funktioniert. Ich habe eine Frage: wie django, dass die Ansicht mit der upload_form.html Datei verbunden ist? Ich sehe nichts, was sie verbindet...

0 Stimmen

11voto

Jiawei Dai Punkte 594

Sie können sich auf die Serverbeispiele in Fine Uploader beziehen, die eine Django-Version haben. https://github.com/FineUploader/server-examples/tree/master/python/django-fine-uploader

Es ist sehr elegant und vor allem bietet es eine funktionsreiche js lib. Die Vorlage ist nicht in den Server-Beispielen enthalten, aber Sie können eine Demo auf der Website finden. Feiner Uploader: http://fineuploader.com/demos.html

django-fine-uploader

views.py

UploadView sendet Post- und Delete-Anfragen an die entsprechenden Handler.

class UploadView(View):

    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(UploadView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        """A POST request. Validate the form and then handle the upload
        based ont the POSTed data. Does not handle extra parameters yet.
        """
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_upload(request.FILES['qqfile'], form.cleaned_data)
            return make_response(content=json.dumps({ 'success': True }))
        else:
            return make_response(status=400,
                content=json.dumps({
                    'success': False,
                    'error': '%s' % repr(form.errors)
                }))

    def delete(self, request, *args, **kwargs):
        """A DELETE request. If found, deletes a file with the corresponding
        UUID from the server's filesystem.
        """
        qquuid = kwargs.get('qquuid', '')
        if qquuid:
            try:
                handle_deleted_file(qquuid)
                return make_response(content=json.dumps({ 'success': True }))
            except Exception, e:
                return make_response(status=400,
                    content=json.dumps({
                        'success': False,
                        'error': '%s' % repr(e)
                    }))
        return make_response(status=404,
            content=json.dumps({
                'success': False,
                'error': 'File not present'
            }))

formulare.py

class UploadFileForm(forms.Form):

    """ This form represents a basic request from Fine Uploader.
    The required fields will **always** be sent, the other fields are optional
    based on your setup.
    Edit this if you want to add custom parameters in the body of the POST
    request.
    """
    qqfile = forms.FileField()
    qquuid = forms.CharField()
    qqfilename = forms.CharField()
    qqpartindex = forms.IntegerField(required=False)
    qqchunksize = forms.IntegerField(required=False)
    qqpartbyteoffset = forms.IntegerField(required=False)
    qqtotalfilesize = forms.IntegerField(required=False)
    qqtotalparts = forms.IntegerField(required=False)

8voto

PhoebeB Punkte 8029

Ich bin mir nicht sicher, ob dieser Ansatz irgendwelche Nachteile hat, aber in views.py ist er sogar noch minimaler:

entry = form.save()

# save uploaded file
if request.FILES['myfile']:
    entry.myfile.save(request.FILES['myfile']._name, request.FILES['myfile'], True)

0voto

hlpmee Punkte 53

Ich konfrontiert das ähnliche Problem, und von django Admin-Site gelöst.

# models
class Document(models.Model):
    docfile = models.FileField(upload_to='documents/Temp/%Y/%m/%d')

    def doc_name(self):
        return self.docfile.name.split('/')[-1] # only the name, not full path

# admin
from myapp.models import Document
class DocumentAdmin(admin.ModelAdmin):
    list_display = ('doc_name',)
admin.site.register(Document, DocumentAdmin)

0 Stimmen

[Linkbeschreibung hier eingeben][1] [Linkbeschreibung hier eingeben][2] [1]: youtu.be/0tNZB3dyopY [2]: youtu.be/klhMYMc3PlY

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X