django rest_framework Dateiupload mit Zusatzdaten

Django, Flask, Bottle, WSGI, CGI…
Antworten
jb_alvarado
User
Beiträge: 55
Registriert: Mittwoch 11. Juli 2018, 11:11

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?
Sirius3
User
Beiträge: 17759
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
jb_alvarado
User
Beiträge: 55
Registriert: Mittwoch 11. Juli 2018, 11:11

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.
Antworten