Thread Alternative zu CGI - Rostis Framework (19 answers)
Opened by rosti at 2018-07-17 10:11

rosti
 2018-07-15 22:28
#188630 #188630
User since
2011-03-19
3196 Artikel
BenutzerIn
[Homepage]
user image
Hi danke der Nachfrage!

Bei einem Upload werden die Daten/HTTP-Message-Body serverseitig aus STDIN gelesen. Maßgeblich hierfür ist die Angabe im Requestheader Content-Length.

Edit: Falls Du CGI.pm verwendest, ist STDIN abgeräumt! Verzichte also auf CGI.pm


Du könntest also, weit weg von multipart/form-data, mit File API ein Upload ganz einfach so machen, daß die im Browser eingefügte Datei, die ja als Blob vorliegt, so wie sie ist, per POST oder PUT als Message-Body gesendet wird: xhr.send(blob);

Alle weiteren Angaben kommen entweder in den Query-String oder in einen custom Request-Header. Also ich habe mir ein eigenes xCGI.pm geschrieben, was um solche custom Content-Types erweiterbar ist.

Der Verzicht auf CGI.pm an dieser Stelle bringt einen Performanceschub um den Faktor tausend und höher. Vor allem wird damit nicht der Server vergewaltigt.

Wenn Du Dir den Content-Type multipart/form-data mal anschaust, kannst Du Dir ja in etwa vorstellen, daß der Parser ziemlich CPU-lastig sein muss. Mit CGI.pm werden auch temporäre Dateien angelegt. Alles in Allem ist das ziemlicher Schrott zumal es seit Jahren bessere Alternativen gibt welche die FileAPI ermöglicht.

MfG

PS: HTML/JS
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
<input type="file" id="uplink" onchange="upload()">

<script>
function upload(){
var xhr = new XMLHttpRequest();
xhr.open('PUT','/cgi-bin/nph-echo.cgi');
xhr.onload = function(){
console.log( this.response );
};
/* Einfach den Blob senden */
xhr.send( document.getElementById('uplink').files[0] );
}
</script>



Serverseitig, Perl:
Code (perl): (dl )
    read(STDIN, my $binary, $ENV{CONTENT_LENGTH});

Last edited: 2018-07-16 10:52:28 +0200 (CEST)

View full thread Alternative zu CGI - Rostis Framework