Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Download    Reaktionen    Spiele    Gadgets    Kontakt   




<<< Apache Webserver         Python: USB Kommunikation >>>

Dateiübertragung zum Webserver

Python zum Dateiempfang auf dem Webserver

Um Dateien auf einen Webserver hochladen zu können, muss ein entsprechendes Programm auf diesem laufen, das die empfangenen Daten in einer Datei speichert. In diesem Kapitel verwende ich ein Python-Skript, das diese Funktion bereitstellt. Im vorherigen Kapitel ist beschrieben, wie der Webserver zu installieren und zu konfigurieren ist, damit Python-Skripts aufgerufen werden können. Das hier gezeigte Beispielskript habe ich auf cgi.tutorial.codepoint.net gefunden und nur leicht abgeändert.
Das Script muss unter dem Namen "fileupload-server.py" im Unterverzeichnis "python" des Webservers gespeichert werden. Ferner muss das Skript ausführbar sein und der Benutzer "www-data" muss Schreibrechte im Verzeichnis "python" besitzen!

sudo chmod a+x /home/pi/www/python/fileupload-server.py
sudo chown www-data:www-data /home/pi/www/python -R

Die empfangene Datei wird im Verzeichnis des Skripts, also im Unterverzeichnis "python" des Webservers gespeichert. Das Skript erzeugt über die "print"-Befehle eine html-Datei, die bei erfolgreichem Dateiempfang die Meldung "The file upload.bmp was uploaded successfully" ausgibt. Ist etwas schief gelaufen, so wird die Meldung "No file was uploaded" ausgegeben. In beiden Fällen wird ferner eine Zeile Javascript generiert, die dazu führt, dass die Datei "index.html" im übergeordneten Verzeichnis (also dem Basisverzeichnis des Webservers) nach 3 Sekunden aufgerufen wird.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python  
import cgi, os  
import cgitb; cgitb.enable()  
 
form = cgi.FieldStorage()  
 
# A nested FieldStorage instance holds the file  
fileitem = form['file']  
 
# Test if the file was uploaded  
if fileitem.filename:  
 
    # strip leading path from file name  
    # to avoid directory traversal attacks  
    fn = os.path.basename(fileitem.filename)  
    # open('files/' + fn, 'wb').write(fileitem.file.read()) # Use file name from index.html  
    open("upload.bmp", 'wb').write(fileitem.file.read())   # Use fixed file name  
    message = 'The file "' + fn + '" was uploaded successfully'  
 
else:  
    message = 'No file was uploaded'  
 
message = message + "\n\r<SCRIPT language=\"JavaScript\">\n\r<!--\n\r setTimeout(\"window.location.href='../index.html?'\",3000);\n\r// -->\n\r</SCRIPT>\n\r"  
 
print("""\  
Content-Type: text/html\n\n  
<html><body>  
<p>%s</p>  
</body></html>  
""" % (message,))  
    

Eine simple HTML Datei auf dem Webserver zur Kommunikation mit dem Client-Rechner

Der Dateitransfer soll per Browser erfolgen, womit eine html-Datei benötigt wird. Das hier beschriebene Beispiel muss unter dem Namen "index.html" im Basisverzeichnis des Webservers (/home/pi/www) gespeichert sein. Aufgerufen wird die Datei über die IP-Adresse des Webservers im Browser (siehe vorheriges Kapitel). Die Auswahl der Dateien ist auf Bitmaps (*.bmp) limitiert, prinzipiell können mit dem auf dieser Seite beschriebenen Verfahren aber alle Dateitypen hochgeladen werden.

<html> <head> <title>File upload via browser</title> <meta content=""> <meta name="viewport" content="width=300"> <style></style> <script type="text/javascript"> function isValidFile(){ if(document.getElementById("upfileID").files.length > 0){ if(document.getElementById("upfileID").files.length > 1){ alert("Don't select more than one file!"); return false; } } else{ alert("No file selected!"); return false; } return true; } function loadNewPicture(){ var d = new Date(); document.getElementById("uploadIMG").src = "python/upload.bmp?ver=" + d.getTime(); } </script> </head> <body onload="loadNewPicture()"> <h2>File upload demo</h2> <table style=" border-collapse: collapse; border: 1px solid black; float: left;" cellspacing="5" cellpadding="5" width="300px"> <tr> <td> <strong>Select bitmap file</strong><br> </td> </tr> <tr> <td> <form method="POST" enctype="multipart/form-data" action="python/fileupload-server.py" onsubmit="return isValidFile()"> <input type="file" id="upfileID" name="file" accept=".bmp"><br> <br> <input type="submit" value="upload"> </form> </td> </tr> <tr> <td> <img src="python/upload.bmp" id="uploadIMG" alt="Selected file" width="300"> </td> </tr> </table> </body> </html>

"Es klappt net!"

...ist wie immer keine Aussage, mit der euch irgend jemand weiter helfen kann! Jeder Installationsschritt des Apache Webservers gibt eine Meldung aus. Lest euch diese Meldungen gefälligst durch, denn dafür haben die Programmierer die Meldungen geschrieben! Sucht im Internet nach diesen Fehlermeldungen und euch wird geholfen. Ist bei der Installation (scheinbar) alles glatt gelaufen, es funktioniert aber dennoch nicht, so gibt der Browser einen Fehler aus, der weiter helfen kann. Besser ist es aber, im Fehlerspeicher des Webservers nachzuschauen.

tail /var/log/apache2/error.log

Besonders die in dieser Datei gespeicherten Meldungen sind hilfreich, wenn ihr jemanden um Hilfe bitten möchtet. Das kann für einfache Probleme über einen Kommentar auf dieser Seite geschehen. Für kniffligere Fälle solltet ihr vorher lesen, wie ihr mit mir in Kontakt treten könnt.

"Es klappt!" freut mich immer zu hören und bedarf keiner weiteren Ausführungen.
...und wer sich für diese Anleitung und eventuelle Hilfestellungen besonders bedanken möchte, kann gerne mit einer Spende einen Motivationsschub für weitere derartige Kapitel übermitteln - vielen Dank an alle, die davon schon Gebrauch gemacht haben!


Webserver Apache auf einem Raspberry Pi Model B+
Figure 1:
...wenn das neue Bild im Browser erscheint, ist alles korrekt installiert. Der Webserver Apache läuft selbst auf einem Raspberry Pi Model B+ flüssig. Das Script habe ich mit einem Smartphone aufgerufen - es ist keine "App" nötig, ein Browser genügt.




<<< Apache Webserver         Python: USB Kommunikation >>>


Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Archiv    Download    Reaktionen    Spiele    Verweise    Gadgets    Kontakt    Impressum   





Twitter YouTube Hackaday Patreon TPO