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)


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:
1
-----------------------------15781655442049502581165804629
2
Content-Disposition: form-data; name="file1"; filename="blupper.txt"
3
Content-Type: text/plain
4
5
dsfgsdfgsdfg
6
sdfgsdfgsdfg
7
8
upload
9
10
sdfgsdfgsdfg
11
sdfgsdfg
12
13
14
-----------------------------15781655442049502581165804629
15
Content-Disposition: form-data; name="file2"; filename=""
16
Content-Type: application/octet-stream
17
18
19
-----------------------------15781655442049502581165804629
20
Content-Disposition: form-data; name="file3"; filename=""
21
Content-Type: application/octet-stream
22
...

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)


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)


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
1
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)


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)


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)


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)


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 Pandur S. (jetztnicht)


Lesenswert?

Das Schwierige am Upload ist eigentlich das Benennen der Datei...

von Marco H. (damarco)


Lesenswert?

Weshalb? Das steht im Header....

von Marco H. (damarco)


Lesenswert?

Oder aus dem Path extrahieren....
1
<form enctype="multipart/form-data" action="upload" method="POST">
2
    <!-- MAX_FILE_SIZE muss vor dem Dateiupload Input Feld stehen -->
3
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
4
    <!-- Der Name des Input Felds bestimmt den Namen im $_FILES Array -->
5
    Diese Datei hochladen: <input name="userfile" type="file" />
6
    <input type="submit" value="Send File" />
7
</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:

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)


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)


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]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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