Forum: PC-Programmierung Fileupload in html / webserverconfig


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

Ich koennt' mal ein simples Komplettbeispiel brauchen.
Unn zwar wuerd' ich mir gerne eine HTML-Seite basteln, mit der ich "dem 
Webserver" ein File aus dem Browser hochladen kann. Der Webserver (ich 
sag' mal: nginx) sollt' dann dieses File irgendwo speichern und dann von 
mir aus irgendein bash-script oder in C geschriebenes Programm aufrufen, 
was sich dann weiter um die hochgeladene Datei kuemmern soll. Klingt ja 
eigentlich unspektakulaer.
Das habbich gefunden, scheint auf der HTML-Seite genau das zu machen was 
ich will:
https://wiki.selfhtml.org/wiki/HTML/Formulare/input/Datei-Upload

Was mich etwas an der Qualitaet dieser Seite zweifeln laesst, ist der 
"sportliche Umgang" mit Umlauten im HTML-Quelltext. Aber Umlaute sind 
mir erstmal wurst. Nur der spannende Teil wird auch recht lapidar 
abgehandelt:

> Es bedarf serverseitig eines Scriptes (PHP, Perl, JSP …), um die Datei
> nach dem Upload dauerhaft in ein anderes Verzeichnis auf dem Server
> abzulegen.

Jetzt gibts fuer den nginx noch ein extra Modul:
https://www.nginx.com/resources/wiki/modules/upload/

Ok, hab'ich reingebaut in den nginx. Das olle, recht knappe Beispiel 
taucht noch an zig anderen Stellen leicht abgewandelt im www auf, 
irgendwann habbichs mal ans "Laufen" gebracht - ganz toll, wenn ich ein 
kleines Textfile hochlade, kommt eine Monsterdatei raus, mit allem 
moeglichen Quatsch um mein eigentliches Textfile herum.
Sowas von dem Kaliber:
-----------------------------15781655442049502581165804629
Content-Disposition: form-data; name="file1"; filename="blupper.txt"
Content-Type: text/plain

dsfgsdfgsdfg
sdfgsdfgsdfg

upload

sdfgsdfgsdfg
sdfgsdfg


-----------------------------15781655442049502581165804629
Content-Disposition: form-data; name="file2"; filename=""
Content-Type: application/octet-stream


-----------------------------15781655442049502581165804629
Content-Disposition: form-data; name="file3"; filename=""
Content-Type: application/octet-stream
...

Da bin ich wohl irgendwie aufm falschen Dampfer...
Kennt wer ein Komplettbeispiel (also HTML und Serverconfig), moeglichst 
ohne fettes Javascript, PHP, LUA, Perl-Gedoens und kann mich erleuchten?

Gruss
WK

von honko (Gast)


Bewertung
0 lesenswert
nicht lesenswert
cgi-bin kannste knicken bei nginx also auch deine batchdatei wird nicht 
funktionieren. der kann nur fast-cgi und das geht zB mit php.

von maler und landstreicher (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ich kenne keinen webserver, der uploads "einfach so" entgegen nimmt und 
die mit voodoo korrekt behandelt. und ob da jetzt ein shell-script, in c 
geschriebenes programm oder z.b. php läuft und den request entgegen 
nimmt ist doch ziemlich plunswurscht (für meine nördlichen nachbarn 
'komplett egal').

wenn du die weiterbehandlung unbedingt in einem shell-script oder einen 
eigenen programm machen willst, dann kannst du das z.b. auch mit einem
proc_open
 einfach weitergeben.
aber achtung - nach beendigung des requests wird die temporäre datei 
wieder gelöscht, also ggf woanders hin kopieren...

von Εrnst B. (ernst)


Bewertung
0 lesenswert
nicht lesenswert
Dergute W. schrieb:
> Was mich etwas an der Qualitaet dieser Seite zweifeln laesst, ist der
> "sportliche Umgang" mit Umlauten im HTML-Quelltext.

Häh?

Da ist ein ' <meta charset="utf-8" /> ' im html->head.
und es ist ein HTML5-Doctype, das entspricht fast exakt den "best 
practices".

Andersherum wird ein Schuh draus: Wenn heute eine HTML-Lern-Seite noch 
"Kr&uuml;cken" für die Umlaut-Kodierung vorschlägt, würd ich vermuten, 
dass die noch aus dem letzten Jahrtausend stammt...

von Dergute W. (derguteweka)


Bewertung
0 lesenswert
nicht lesenswert
Εrnst B. schrieb:
> Häh?

Aha - again what learned. Ich hab' da das Problem, dass ich so garkeine 
Ahnung von dem ganzen Webgedoedel hab. Und von daher auch nicht so recht 
sicher einschaetzen kann, was grad' der heisse Scheiss ist, und was 
heute kein Schwein mehr macht. Und halt grad bei dem Webzeugs die 
Qualitaet der Tipps im www nicht immer spitze/aktuell ist bzw. 
stillschweigend Zeugs vorausgesetzt wird, von dem ich nix weiss.
So aehnlich, wie wenn ein Webentwickler, ohne mit der Wimper zu zucken, 
aus einem  Arduino I/O Port locker 5 LEDs parallel geschaltet betreibt 
:-)

Gruss
WK

Beitrag #6315445 wurde von einem Moderator gelöscht.
von Marco H. (damarco)


Bewertung
0 lesenswert
nicht lesenswert
Tja dann muss man den Server entsprechend konfigurieren...

"Upload" ist ein request mit der Methode POST..  Du musst den Server nur 
beibringen was zu tun ist wenn auf eine Ressource mit POST zugriffen 
wird.

In den meisten HTTP Servern/Clients ist so ein File Upload mit 
eingebaut...

Der Client schickt die Daten zum Server was der damit macht ist seine 
Sache ;).

Genau so funktioniert es mit PHP und co.  Der Server ist so konfiguriert 
das er aufgrund der Ressource das die Daten an das entsprechende Modul 
übergibt und das Modul die Antwort den Server...

Ressource heißt MIME-Type bzw. Path...

von Hmmm (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dergute W. schrieb:
> Kennt wer ein Komplettbeispiel (also HTML und Serverconfig), moeglichst
> ohne fettes Javascript, PHP, LUA, Perl-Gedoens und kann mich erleuchten?

Da Du bestimmt nicht zu Fuss multipart/form-data verarbeiten willst, 
bleibt nur ein passendes Framework.

In PHP sind das ein paar Zeilen Code:

https://www.php.net/manual/en/features.file-upload.post-method.php

von Joggel E. (jetztnicht)


Bewertung
0 lesenswert
nicht lesenswert
Das Schwierige am Upload ist eigentlich das Benennen der Datei...

von Marco H. (damarco)


Bewertung
0 lesenswert
nicht lesenswert
Weshalb? Das steht im Header....

von Marco H. (damarco)


Bewertung
0 lesenswert
nicht lesenswert
Oder aus dem Path extrahieren....
<form enctype="multipart/form-data" action="upload" method="POST">
    <!-- MAX_FILE_SIZE muss vor dem Dateiupload Input Feld stehen -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Der Name des Input Felds bestimmt den Namen im $_FILES Array -->
    Diese Datei hochladen: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

Total simple... Das wäre die Seite im Browser....

Es gibt aber Bruchstellen..  Das Modul muss anhand der Dateigröße oder 
über einer Checksumme die im Header untergebracht wird prüfen ob alles 
übertragen wurde.  Es ist das Manual des Moduls zurate zu ziehen welche 
Angaben im Header nötig sind...

von Dergute W. (derguteweka)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Nur dass ich's mal wiederfind: Hier der ganze Klumpatsch fuer ein 
Simpelbeispiel. Das nginx-upload module braucht's/ich dazu nicht.
Aber das hier noch:
https://github.com/FastCGI-Archives/fcgi2.git
https://github.com/lighttpd/spawn-fcgi.git
Beides ggf. bauen+installieren;
Dann noch das c-file aus dem zeuchs.tar.bz2 bauen und starten, nginx mit 
der config und website starten.
Der Upload liegt dann unter /tmp/upload.jpg
Jaaa, ich weiss, der multipart-parser ist nicht die reine Lehre und da 
gibts sicher was besseres und der geht nur fuer dieses Beispiel und ist 
nicht portabel und hat sicher zig Stellen, wo was schieflaufen kann und 
es nicht abgefangen wird.

Gruss
WK

von Miro V. (miro_v)


Bewertung
0 lesenswert
nicht lesenswert
Ich würde es so machen:

1) Erzeuge ein normales HTML Formular mit einem fileupload. Als form 
action gibst du ein php script oder dergleichen an. Dieses Script 
kümmert sich um den Upload der Datei.
2) Erzeuge einen Dienst (listener) der den Upload Order (den Ordner wo 
dein PHP Script die Dateien ablegt) ständig auf Änderungen überwacht. 
Sobald eine neue Datei dort abgelegt wird, macht der listener irgendwas 
damit. Zum Beispiel die Datei verschieben, nen Programm starten etc...

von pegel (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ist das nicht ein Fall für WEBDAV?

https://nginx.org/en/docs/http/ngx_http_dav_module.html

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.