Frage

Was ich versuche zu erreichen ist einige binären Daten laden, und zwar ein ByteArray ein PNG-Bild darstellt, zu einem Server der URLLoader-Klasse in Verbindung mit URLRequest verwenden.

Wenn ich die contentType Eigenschaft des URLRequest zu ‚multipart / form-data‘ anstelle des Standard gesetzt, der Anruf führt zu einer Sicherheitsausnahme urlLoader.load().

Wenn ich die contentType Eigenschaft als Standard verlassen, es funktioniert gut, aber dauert eine lange Zeit (proportional zur Länge der PNG-Datei), um die Datei auf den Server zu laden.

So ist meine Frage, warum bin ich diese Sicherheitsausnahme zu bekommen? Und wie kann ich es vermeiden?

Beachten Sie, dass mein SWF von einem Entwicklungsserver serviert wird, nicht das lokale Dateisystem (der Google App Engine-Entwicklungsserver um genau zu sein).

Hier ist der Code:

var pngFile:ByteArray = PNGEncoder.encode(bitmapData);

var urlRequest:URLRequest = new URLRequest('/API/uploadImage');

// With this line of code, the call to urlLoader.load() throws the following security exception:
// 'SecurityError: Error #2176: Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press.'
urlRequest.contentType = 'multipart/form-data';

urlRequest.method = URLRequestMethod.POST;
urlRequest.data = pngFile;
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));

urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.addEventListener(Event.COMPLETE, onUploadComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onUploadError);

NextFrame.addCallback(function () {
    urlLoader.load(urlRequest);
});
War es hilfreich?

Lösung

Es könnte möglich sein, dass contentType nicht bezieht, welche Daten Sie senden, sondern auf das, was Daten, die Sie erhalten. Versuchen Sie, die requestHeaders zu setzen, das sollte funktionieren:

urlRequest.requestHeaders.push(new URLRequestHeader('Content-type', 'multipart/form-data'));

Außerdem habe ich ein Stück Code gefunden, wo in einem meiner Projekte. Der Code funktioniert und sendet einige binären JPEG-Daten an den Server, mit POST. Ich dit es vor einiger Zeit und ich kann nicht erklären, warum ich die Dinge tat so, aber vielleicht hilft es. Ich bin einfügen es wie:

function sendData(submitPath:String, descriere:String):void {
    // building the url request for uploading the jpeg to the server
    var header:URLRequestHeader = new URLRequestHeader('Content-type', 'application/octet-stream');
    var jpgURLRequest:URLRequest = new URLRequest(submitPath+'/id/'+player.id+'/path/'+player.contentPath.replace('/','')+'/width/'+player.videoWidth+'/height/'+player.videoHeight+'/descriere/'+descriere+'/timp/'+time);
    jpgURLRequest.requestHeaders.push(header);
    jpgURLRequest.method = URLRequestMethod.POST;
    jpgURLRequest.data = screenShot;

    // sending the data to the server
    var sender:URLLoader = new URLLoader();
    sender.load(jpgURLRequest);
}

Andere Tipps

Nur der Vollständigkeit halber, hier ist, wie ich meine URLRequest-Objekt (alles andere gleich geblieben) am Ende der Einrichtung:

urlRequest.method = URLRequestMethod.POST;
urlRequest.data = UploadPostHelper.getPostData('filename', pngFile);
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));
urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));

Der Schlüssel, wie evilpenguin weist darauf hin, war nicht die Eigenschaft contentüberhaupt zu setzen, sondern es im Header zu setzen. Mit nur ‚multipart / form-data‘ aber ich habe einen Fehler auf der Serverseite über ungültige POST Grenzen, so dass ich am Ende mit eine Klasse mit dem Namen UploadPostHelper eine gültige Grenze und POST-Körper für das Hochladen von Dateien zu erstellen.

Diese fest die mysteriösen Sicherheitsfehler (ich weiß noch nicht, warum das passiert ist), und die sehr langen Wartezeiten für Uploads.

Es sollte beachtet werden, dass der Beispielcode für die Verwendung von UploadPostHelper die contentType Eigenschaft des URLRequest-Objekts beinhaltet Einstellung, und das funktioniert offensichtlich für einige Leute, aber nicht in meinem Fall.

Ich hatte das gleiche Problem. Es funktionierte gut, wenn an einen PHP-Skript einreichen, aber nicht zu einem ASP-Skript. den Inhaltstypen zu einem Request Nach dem Umzug, funktioniert es richtig. Hier ist mein Code:

// Object containing form fields
var formdata = new Object();
formdata.Email = textArray[8].text;

//URLRequest containing the form fields and the attached image
var urlRequest : URLRequest = new URLRequest(url);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = UploadPostHelper.getPostData( imageName, imageByteArray, formdata );
urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary())); 

//URLLoader to load the request
var urlLoader : URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load( urlRequest );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top