Seite 1 von 1

django rest_framework Dateiupload mit Zusatzdaten

Verfasst: Dienstag 14. April 2020, 13:45
von jb_alvarado
Hallo Allerseits,
ich versuche es hinzubekomme einen Dateiupload zu realisieren, wobei ich noch zusätzliche Informationen (z.B. Speicherpfad) mitschicken möchte.

Im Dokumentationsbeispiel wird in etwa dieses URL Schema angeben:

Code: Alles auswählen

re_path(r'^upload/(?P<filename>[^/]+)$',  views.FileUpload.as_view())
Und so wie ich das verstehe und getestet habe, wird hier nur ein Dateiname, ohne Pfadangabe unterstützt.Bei meiner Recherche bin ich noch auf diesen Ansatz gestoßen, dort die zweite Antwort. Hier würden zusätzlich Information im JSON Format übergeben, aber das konnte ich nicht nachbauen. Vielleicht ist dazu meine Django Version zu neu?! Verwende 3.0.5.

Meine View schaut daher wieder so aus, wie sie in der rest_framework Doku beschrieben ist:

Code: Alles auswählen

class FileUpload(APIView):
    parser_classes = [FileUploadParser]

    def put(self, request, filename, format=None):
        file_obj = request.data['file']

        with open(filename, 'wb+') as outfile:
            for chunk in file_obj.chunks():
                outfile.write(chunk)
        return Response(status=204)
Als Frontend verwende ich vuejs, und axios für die Requests:

Code: Alles auswählen

this.$axios.put('/upload/test.mp4', this.inputFile, config)
    .then(res => console.log(res))
    .catch(err => console.log(err))
Ich könnte mir zwei Wege vorstellen. Entweder schicke ich alles in einem Objekt:

Code: Alles auswählen

this.$axios.put('/upload/test.mp4', { data: { file: this.inputFile, path: '/test/path/' } }, config)
Oder ich schicke die Zusatzinfos per URL mit:

Code: Alles auswählen

this.$axios.put('/upload/?path="/test/path/"&file=test.mp4', this.inputFile, config)
Mit würde allerdings der erste Ansatz mehr zusagen.
Habt ihr eine Idee wie ich das umsetzten kann?

Re: django rest_framework Dateiupload mit Zusatzdaten

Verfasst: Dienstag 14. April 2020, 14:00
von Sirius3
Für File-Upload wird normalerweise ein Formular benutzt. Dem kann man natürlich auch noch weitere Felder wie pfad hinzufügen. Was this.inputFile ist, sieht man hier nicht, ist das denn ein Datei-Objekt?
'wb+' ist als Filemode nicht sinnvoll. 'wb' reicht völlig.

Re: django rest_framework Dateiupload mit Zusatzdaten

Verfasst: Dienstag 14. April 2020, 14:22
von jb_alvarado
Ja this.inputFile ist ein FileObject. Im Browserlog würde das so ausgegeben werden:

Code: Alles auswählen

File { name: "test.mp4", lastModified: 1576239106000, webkitRelativePath: "", size: 371452409, type: "video/mp4" }
Ich habe auch mal versucht, dem Objekt noch mehr Eigenschaften hinzu zufügen. Das würde im Javascript gehen, aber ich habe es nicht hinbekommen das dann auch im django view auszulesen.

Edit: ok, habe es hinbekommen:

Code: Alles auswählen

this.$axios.put('/upload/test.mp4?path=test/folder', this.inputFile, config)
                .then(res => console.log(res))
                .catch(err => console.log(err))
Und in der View kann ich das dann mit "request.query_params['path']" angreifen.