Hallo zusammen,
folgende Idee: ich möchte ein Gadget für die Windows Vista & 7 Sidebar (ja, die mag Deprecated sein) veröffentlichen,
mit welchem ich Dateien via Drag & Drop an einen HTTP-Server übermitteln kann.
Grundsätzliche Infos zur Sidebar:
Die Gadgets werden vom Internet Explorer verarbeitet, dabei stehen erweiterte Sicherheitsrichtlinien zur Verfügung.
Voraussetzungen:
- Ich möchte sowohl Binäre- als auch Textdateien übertragen können.
- Der Fortschritt des Uploadvorgangs soll möglichst ohne Rückfrage beim Empfänger ermittelt werden können.
- Auch große Dateien (mind. 500 MB) sollen übertragen werden können.
Ansätze:
Der IE9 schließt ein Drag & Drop via HTML5 leider aus.
Dafür kann eine Datei mit den folgenden Body-Attributen
entgegen genommen werden:
<body
ondragenter="event.returnValue = false"
ondragover="event.returnValue = false"
ondragleave="event.returnValue = false"
ondrop="GetItemFromDrop()"></body>
Mit folgendem Schnipsel kann ich den Inhalt der gedropten Datei auch bereits an den Server übermitteln:
// ich habe die Zieldatei bereits mit
// System.Shell.itemFromFileDrop(event.dataTransfer, intIndex)
// entgegen genommen, sie befindet sich in oItem
var adTypeBinary = 1;
var adTypeText = 2;
var oStream = new ActiveXObject("ADODB.Stream");
oStream.Type = adTypeText;
oStream.CharSet = "UTF-8";
oStream.Open;
oStream.LoadFromFile(oItem.path);
var fileData = oStream.ReadText;
oStream.Close;
var boundaryString = "AaBbCcX30";
var boundary = "--" + boundaryString;
var postContent = "\r\n"+boundary+"\r\n"+
"Content-Disposition: form-data; name=\"data\"\r\n"+
"\r\n"+
boundary+"\r\n"+
"Content-Disposition: file; name=\"file\"; filename=\"xxx.mp3\"\r\n"+
"Content-Type: text/plain\r\n"+
"\r\n"+
"%FILECONTENT%\r\n"+
boundary+"\r\n";
postContent = postContent.replace("%FILECONTENT%", fileData);
var req = new XMLHttpRequest();
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundaryString);
req.onreadystatechange = function() {
if(req.readyState == 4) {
if(req.status == 200) {
alert('strike!');
}
}
};
req.send(postContent);
}
Natürlich führt das zu Problemen bei Dateien jenseits der 10 MB.
Auch der Vortschritt der Übertragung ist nicht ohne weiteres(?) ersichtlich.
Ich würde die Datei gerne weiterhin über die Shell entgegen nehmen,
dann aber mit einem Flash-Uploader weiterverarbeiten - z.B. dem YUI Uploader.
Dieser akzeptiert jedoch leider nur Dateien die über das eigene Explorer-
Fenster ausgewählt werden. Lässt sich die Datei auf einem anderen Weg oder
mit einem anderen Tool entgegennehmen?
Für weitere Ideen bin ich sehr dankbar!