| 

.NET C# Java Javascript Exception

3
Erste Frage
ist es mit jQuery über .ajax() möglich binäre Daten, wie z.B. eine Video-Datei, zu empfangen und
Zweite Frage
die empfangenen Daten mittels download-push dem User als Download anzubieten?

Edit:
Wenn bei der ersten Frage ein Nein rauskommt, ist es irgendwie sonst mit JavaScript möglich binäre Daten zu empfangen?

Edit2:
Also das Use Case.
Gegeben ist ein Server, auf dem Videos rumliegen. Diese Videos sind aber nicht direkt abrufbar. Um an ein Video zu gelangen, muß man zuerst dem Server den Dateinamen von dem gewünschten Video geben und bekommt einen Key zurück. Dieser Key ist IP-gebunden. Schmeißt man den Dateinamen zusammen mit dem Key gegen den Server, bekommt man eine Datei video (die heißt immer so) zurück. Das Konstrukt war ursprünglich als Video-Pool für einen FlashVideoPlayer gedacht. Jetzt sollen die Videos aber auch downloadbar werden, ohne was an der Ausgangssituation zu ändern.
Es wär natürlich theoretisch möglich das alles PHP machen zu lassen, ebenso den Download und PHP gibt sich dann einfach als Dateiname.flv aus und der User läd es runter. Das findet der Webserver allerdings bei Videos von Größen um die 1GB-2GB gar nicht lustig.
Daher hab ich mal ganz naiv gedacht, es wär ziemlich prima, wenn ich den Prozess nicht auf dem Webserver abfackel, sondern mit Javascript beim User.

Edit3:
Ich stell es nochmal etwas bildlicher dar, da ich glaube, das ich mich mißverständlich ausgedrückt hab. Die Idee war folgende:
remote-file: foo.bar -> JavaScript -> downloadpush remote-file als NeueDatei.mp4 ->
Speichern-Prompt beim User


Edit4:
Nachdem ich jetzt die Antworten und Kommentare hier durchgegangen bin und zusätzlich noch diverse Beiträge im Netz durchstöbert hab, bin ich zu dem Schluss gekommen, daß ein
'Content-Type: application/force-download'
nur mit JavaScript nicht wirklich möglich ist. Damit ist dann auch der erste Teil der Frage hinfällig, auch wenn ich da mittlerweile eine funktionierende Lösungen gefunden habe
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(e) {
var arraybuffer = xhr.response; // not responseText
/* ... */
}
xhr.send();
News:
22.01.2013
lunatigs 1,3k 2 8
lunatigs 1,3k 2 8
3 Antworten
1
Ich denke, die Beste Lösung für Dein Problem wäre das hier: mod_xsendfile.
Ein Beispiel: Sending files better: Apache mod_xsendfile and PHP

Setzt aber voraus dass Du es auf Deinem Server installiert hast.
24.01.2013
Jaksa 4,0k 2 8
Wenn es ginge, daß man statt
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: /home/username/hello.txt');
folgendes schreibt
header('Content-Disposition: attachment;filename=hello.txt');
header('X-Sendfile: http://www.remote-server.de/hello.txt');
wärs genau das was ich bräuchte.
lunatigs 24.01.2013
So wie ich das Modul verstehe, ist es wesentlich, dass es einen *lokalen* Pfad bekommt, von dem es die Datei ausliefern kann.
Matthias Hlawatsch 24.01.2013
Du kannst /hello.txt in /home/username/hello.txt umwandlen, siehe PHP Funktion Realpath. Aber ehrlich gesagt, finde ich Dein Security Konzept ein wenig suboptimal.
Jaksa 24.01.2013
Ich hab diese Antwort mal als Lösung akzeptiert, weil Du deutlich weniger Reputation als Matthias hast und weil die Antwort dem Kern der ganzen Problematik eigentlich am nächsten kommt.
lunatigs 24.01.2013
Ist jetzt eh zu spät, Du solltest aber immer die Antwort nehmen, die Dir zu Lösung des Problems am meisten geholfen hat - unabhängig von der Reputation der Person.
Trotzdem danke ;)
Jaksa 24.01.2013
Hab ich ja auch.
lunatigs 27.01.2013
2
Du könntest einen hidden iframe benutzen und dessen location per Javascript auf eine URL setzen, die die gewünschte Datei ausliefert und die passenden HTTP-Response-Header setzt, so dass der Browser die Datei auf jeden Fall zum Download anbietet. Das ganze ist z.B. hier beschrieben.
23.01.2013
Matthias Hlawatsch 13,2k 4 9
Daran hatte ich auch schon gedacht, aber da nur die Location des iFrames auf die Datei gesetzt wird, würde im Falle eines browserinternen Videoplayers einfach nur das Video im unsichtbaren iFrame anfangen abzuspielen und nicht als Download angeboten.
lunatigs 24.01.2013
1
Hast Du es ausprobiert? Der Trick sind die beiden Response-Header. Und zumindest von PDFs weiß ich aus eigener Surf-Erfahrung, dass es Seiten gibt, die effektiv verhindern, dass ein zum Download angebotenes PDF direkt im Browser angezeigt wird.

'Content-Disposition: attachment; filename="abc.wmv"'

sollte normalerweise schon reichen.

'Content-Type: application/force-download'

ist nach meinem Verständnis ein zusätzlicher Hack, der gegenüber dem Browser den wahren Dateityp verschleiern soll, so dass der gar nicht weiß, welches Plugin er verwenden könnte.
Matthias Hlawatsch 24.01.2013
@lunatigs: Nach Deinem Ursprungspost bin ich davon ausgegangen dass das nicht funktionieren kann, Zitat: "Diese Videos sind aber nicht direkt abrufbar". Sind die Videos jetzt direkt abrufbar oder nicht. Sprich könnte ich die Datei jetzt direkt downloaden, wenn ich die URL kennen würde?
Jaksa 24.01.2013
@Matthias: Hängt ein wenig vom Apache und den Modulen ab ob das funktioniert.
Jaksa 24.01.2013
@Jaksa: kannst Du das mit den Modulen genauer erläutern? Ich würde erwarten, dass das funktioniert, wann immer diese beiden Header geliefert werden und die richtigen Bytes im Body stehen. Das sollte jeder HTTP-Server können, der diesen Namen verdient.
Matthias Hlawatsch 24.01.2013
@Matthias: mod_header muss aktiviert sein.
Übrigens, um PDFs am öffnen zu hindern, reiht folgende Angabe im Apache:
<FilesMatch "\.pdf$">
Header set Content-Disposition attachment
</FilesMatch>
Jaksa 24.01.2013
@Matthias: Ähm, also, das war ja gerade die Frage, wie ich das _ohne_ "filedownloader.php" hinkriege und _nur_ mit JavaScript. Das beantwortet der Link von Dir jetzt nicht soweit ich das ersehen kann.
@Jaska: Du kannst die Datei für eine bestimmte Zeit direkt downloaden wenn Du URL und den für Deine Anfrage generierten Key kennst. Allerdings heißt die Datei immer video. Daher wollte ich mittels JavaScript praktisch die Datei video abfangen und als z.B. Schulung001.flv dann dem User als Abspeicher-Aufforderung pushen.
lunatigs 24.01.2013
Du solltest Dein Sicherheitskonzept dringend überarbeiten, Du verstösst schon gegen zwei absolute Grundregeln:
1: Du darfst den Browser nicht trauen.
2: Security through obscurity funktioniert nicht
Jaksa 24.01.2013
@lunatigs: ich habe nicht behauptet, daß Du die HTTP-Header mit PHP setzen mußt. Siehe Jaksas Kommentar - das geht auch per Apache-Konfig (zumindest wenn Du mit dem generischen Dateinamen 'video' leben könntest, den der Benutzer ja noch abändern kann). Und es muß ja schon Server-Code geben, der die Datei unter der /video-URL ausliefert - der müßte die Header so setzen.
Wenn Du den Server gar nicht ändern kannst, dann hast mMn nicht wirklich eine Chance. Vor allem bekommst Du mit einer JS-only-Lösung nichts auf die Platte geschrieben, soweit ich weiß (außer mit üblen, unzuverlässigen Tricks).
Matthias Hlawatsch 24.01.2013
1
Hi,
Hier die Lösung: Workaround solutions to the missing "binary" type with jQuery.ajax().
Ob das aber wirklich sinnvoll ist (Videos per Ajax zu senden) mag ich bezweifeln.
Die Frage 2 verstehe ich nicht wirklich.
Vielleicht kannst Du kurz beschrieben was Du machen willst, dann kann ich mir paar Gedanken dazu machen.
23.01.2013
Jaksa 4,0k 2 8
Ich habe die Frage so verstanden, dass die Binärdaten letztlich als Datei auf der Festplatte landen sollen. Und aus irgendwelchen Gründen soll dafür kein normaler Link benutzt werden. Aber Du hast völlig recht - den eigentlichen Use Case zu kennen, würde helfen.
Matthias Hlawatsch 23.01.2013
Ob das so sinnvoll ist, weiß ich auch noch nicht :) Aber schon mal danke für die Antwort zum binary Problem :)
lunatigs 24.01.2013

Stelle deine Javascript-Frage jetzt!