Frage

Ich habe eine Datei-Upload-Skript Flex, die URLRequest verwendet, um Dateien auf einen Server hochladen. Ich mag die Unterstützung für HTTP-Authentifizierung (Passwort geschützte Verzeichnisse auf dem Server) hinzufügen, aber ich weiß nicht, wie dies zu implementieren - ich nehme an, ich brauche die Klasse irgendwie zu verlängern, sondern darauf, wie ich ein wenig verloren bin.

Ich habe versucht, die folgenden (als Ersatz für HTTPService- mit URLRequest) zu ändern, aber das hat nicht funktioniert.

private function authAndSend(service:HTTPService):void{        
   var encoder:Base64Encoder = new Base64Encoder();        
   encoder.encode("someusername:somepassword");        
   service.headers = {Authorization:"Basic " + encoder.toString()};
   service.send();
}

Ich möchte darauf hinweisen, dass ich nicht gut informiert bin, wenn es um Actionscript / Flex kommt, obwohl ich erfolgreich geschafft haben, etwas das Upload-Skript zu ändern.

[Bearbeiten] - hier ist ein Update meines Fortschritts, auf der Grundlage der Antwort unten, obwohl ich immer noch nicht dies funktioniert:

Vielen Dank für Ihre Unterstützung. Ich habe versucht, den Code zu implementieren, aber ich habe kein Glück gehabt.

Das allgemeine Verhalten, das ich erlebt habe, wenn sie mit HTTP-Authentifizierung Stellen zu tun, ist, dass mit IE7 alles gut ist, aber in Firefox, wenn ich versuche, eine Datei auf den Server hochzuladen eine HTTP-Authentifizierungsaufforderung zeigt - die auch die richtigen Informationen, wenn gegeben , einfach abgewürgt den Upload-Prozess.

Ich glaube, der Grund, warum IE7 ok ist bis auf das die Sitzung / Authentifizierungsinformationen vom Browser geteilt wird und die Flash-Komponente - jedoch in Firefox dies nicht der Fall ist und ich erlebe das obige Verhalten

.

Hier ist meine aktualisierte Upload-Funktion, enthält die Änderungen:

private function pergress():void 
{
if (fileCollection.length == 0) 
  {
  var urlString:String = "upload_process.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&filetotal="+fileTotal;
  if (ExternalInterface.available) 
    {
    ExternalInterface.call("uploadComplete", urlString);
    }
  }
if (fileCollection.length > 0) 
  {
  fileTotal++;
  var urlRequest:URLRequest = new URLRequest("upload_file.php?folder="+folderId+"&type="+uploadType+"&feid="+formElementId+"&obfuscate="+obfuscateHash+"&sessidpass="+sessionPass);
  urlRequest.method = URLRequestMethod.POST;
  urlRequest.data = new URLVariables("name=Bryn+Jones");
  var encoder:Base64Encoder = new Base64Encoder();
  encoder.encode("testuser:testpass");
  var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
  urlRequest.requestHeaders.push(credsHeader);

  file = FileReference(fileCollection.getItemAt(0));
  file.addEventListener(Event.COMPLETE, completeHandler);
  file.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus);
  file.addEventListener(ProgressEvent.PROGRESS, onUploadProgress);
  file.upload(urlRequest);
  }
}

Wie oben erwähnt, scheinen wir die gleichen Ergebnisse mit oder ohne die Änderungen zu meiner Funktion zu erleben.

Kann ich auch fragen, wo die crossdomain.xml befinden sollte -. Wie ich zur Zeit nicht habe ein und ist nicht sicher, wo es zu platzieren

War es hilfreich?

Lösung

Die Syntax ist ein wenig anders für URLRequest, aber die Idee ist das gleiche:

private function doWork():void
{
    var req:URLRequest = new URLRequest("http://yoursite.com/yourservice.ext");
    req.method = URLRequestMethod.POST;
    req.data = new URLVariables("name=John+Doe");

    var encoder:Base64Encoder = new Base64Encoder();        
    encoder.encode("yourusername:yourpassword");

    var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());
    req.requestHeaders.push(credsHeader);

    var loader:URLLoader = new URLLoader();
    loader.load(req);
}

Ein paar Dinge im Auge zu behalten:

  • Best Ich kann sagen, aus irgendeinem Grund, dies funktioniert nur, wenn Anforderungsmethode POST ist; die Header werden nicht mit GET-Anforderungen festgelegt.

  • Interessanterweise versagt auch wenn nicht mindestens ein URLVariables Name-Wert-Paar mit dem Wunsch verpackt wird, wie oben angegeben. Deshalb sind viele der Beispiele, die Sie dort sehen (einschließlich mir) anhängen „name = John + Doe“ - es ist nur ein Platzhalter für einige Daten, die URLRequest zu erfordern scheint, wenn alle benutzerdefinierten HTTP-Header zu setzen. Ohne sie sogar eine richtig POST-Anforderung authentifiziert wird auch fehlschlagen.

  • Offenbar Flash-Player Version 9.0.115.0 vollständig blockiert alle Authorization Header (Weitere Informationen zu diesem hier ), so dass Sie wahrscheinlich, dass im Auge behalten werden wollen, auch.

  • Sie werden fast müssen sicher Ihre crossdomain.xml-Datei ändern den Header zur Aufnahme (n) zu senden wirst werden. In meinem Fall bin ich mit dieser, was, dass eine ziemlich weit aufgerissenen Policy-Datei ist es aus einem beliebigen Domäne akzeptiert, so in Ihrem Fall, sollten Sie die Dinge ein wenig zu begrenzen, je nachdem, wie sicherheitsbewusste Sie sind .

crossdomain.xml:

<?xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*" />
    <allow-http-request-headers-from domain="*" headers="Authorization" />
</cross-domain-policy> 

... und das scheint zu funktionieren; Weitere Informationen zu dieser ist von Adobe hier ).

Der obige Code wurde mit Flash-Player getestet 10 (mit Debug & Release SWFs), so sollte es für Sie arbeitet, aber ich wollte meinen ursprünglichen Beitrag aktualisieren all diese zusätzliche Informationen für den Fall enthält, die Sie in Probleme laufen, wie die Chancen scheinen (leider) wahrscheinlich, dass Sie werden.

Hoffe, es hilft! Viel Glück. Ich werde ein Auge für Kommentare.

Andere Tipps

Die FileReference.upload () und FileReference.download () Methoden unterstützen nicht die URLRequest.requestHeaders Parameter.

http://livedocs.adobe.com/flex /2/langref/flash/net/URLRequest.html

Wenn Sie eine Datei hochladen möchten, müssen Sie nur die richtigen Header und den Inhalt der Datei über UploadPostHelper-Klasse URLRequest senden. Dies funktioniert 100%, ich diese Klasse bin mit erzeugten Bildern und CSV-Dateien laden, aber man konnte jede Art von Datei hochladen.

Diese Klasse bereitet einfach die Anforderung mit Header und Inhalte, als ob Sie die Datei von einem HTML-Formular würde hochladen.

http: // Code. google.com/p/as3asclublib/source/browse/trunk/net/UploadPostHelper.as?r=118

_urlRequest = new URLRequest(url);
        _urlRequest.data = "LoG";
        _urlRequest.method = URLRequestMethod.POST; 

        _urlRequest.requestHeaders.push(new URLRequestHeader("X-HTTP-Code-Override", "true"));
        _urlRequest.requestHeaders.push(new URLRequestHeader("pragma", "no-cache"));

        initCredentials();
_loader.dataFormat = URLLoaderDataFormat.BINARY;
            //this creates a security problem, putting the content type in the headers bypasses this problem
            //_urlRequest.contentType = 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary();
            _urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
            _urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));
            _urlRequest.data = UploadPostHelper.getPostData("file.csv", param[1]);

        _loader.load(_urlRequest);

Ich bin mir nicht sicher über diese aber haben Sie versucht, das Hinzufügen Benutzername: Passwort @ zu Beginn Ihrer url

" http: // username: password@yoursite.com/yourservice.ext "

var service : HTTPService  = new HTTPService ();
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false;
encoder.encode("user:password");

service.headers = {Authorization:"Basic " + encoder.toString()};
service.method = HTTPRequestMessage.POST_METHOD;
service.request = new URLVariables("name=John+Doe");
service.addEventListener(FaultEvent.FAULT,error_handler );
service.addEventListener(ResultEvent.RESULT,result_handler);
service.url = 'http://blah.blah.xml?'+UIDUtil.createUID();
service.send();

Scheinbar ähnliches Problem wurde gelöst hier . Ich fordere Sie auf, auch die überprüfen Flexcoders Post verknüpft in der erste Eintrag.

Das Problem war, dass FireFox ein separates Browserfenster Beispiel verwendet die Datei-Upload-Anfrage zu senden. Die Lösung ist manuell die Session-ID an die URL anhängen. Die Session-ID wird nicht als reguläres GET-Variable gebunden, aber mit einem Semikolon (der Grund für diese Syntax ist mir nicht bekannt).

Flash ist sehr in Bezug auf welche Art von Header beschränkt Sie mit einer HTTP-Anforderung passieren kann (und es ändert sich zwischen Browser und Betriebssysteme). Wenn Sie dies auf der einen Browser / OS zu arbeiten, stellen Sie sicher, dass Sie es auf den anderen testen.

Das Beste, was zu tun ist, nicht verwirren mit HTTP-Header.

Wir haben das gleiche Problem (das Hochladen in Picasa-Webalben aus dem Flash) und Post über einen Proxy auf unserem Server. Wir passieren die zusätzlichen Header durch als Post-Parameter und unsere Proxy das Richtige tut.

" http: // username: password@yoursite.com/yourservice.ext "

Das funktioniert nicht in IE ( http: // www. theregister.co.uk/2004/01/30/ms_drop_authentication_technique/ ) und scheint nicht in Chrome zu arbeiten.

wahrscheinlich nicht verwendbar in Flash

Hier ist ein Workaround, wenn ASP.Net mit teilweise basierend auf der Arbeit hier .

Ich baute eine Komponente, die Flex-Objekte auf der Seite dynamisch schreibt, so dass sie in Updatepanels verwendet werden. Nachricht mich, wenn Sie wollen sie Code. Um das obige Problem in Seiten zu lösen, wo die Authentifizierung Cookies benötigt, von URLRequest gesendet werden soll, füge ich die Werte in als flashVars.

Dieser Code funktioniert nur in meinem Objekt, aber Sie bekommen die Idee

Dictionary<string, string> flashVars = new Dictionary<string, string>();     
flashVars.Add("auth", Request.Cookies["LOOKINGGLASSFORMSAUTH"].Value);
flashVars.Add("sess", Request.Cookies["ASP.NET_SessionId"].Value);
myFlexObject.SetFlashVars(flashVars);

Dann in dem Flex-Objekt, überprüfen Sie die params

if (Application.application.parameters.sess != null)
    sendVars.sess= Application.application.parameters.sess;
if (Application.application.parameters.auth != null)
    sendVars.au= Application.application.parameters.auth;

request.data = sendVars;
request.url = url;
request.method = URLRequestMethod.POST;

stopfen schließlich die Cookies in auf global.asax Beginrequest

if (Request.RequestType=="POST" && Request.Path.EndsWith("upload.aspx"))
{
    try
    {
        string session_param_name = "sess";
        string session_cookie_name = "ASP.NET_SESSIONID";
        string session_value = Request.Form[session_param_name]; // ?? Request.QueryString[session_param_name];
        if (session_value != null) { UpdateCookie(session_cookie_name, session_value); }
    }
    catch (Exception) { }

    try
    {
        string auth_param_name = "au";
        string auth_cookie_name = FormsAuthentication.FormsCookieName;
        string auth_value = Request.Form[auth_param_name];// ?? Request.QueryString[auth_param_name];

        if (auth_value != null) { UpdateCookie(auth_cookie_name, auth_value); }
    }
    catch (Exception) { }   

}

Hoffen, dass diese Hilfe jemand die 6 Stunden vermeide ich diese gerade verbrachte Adressierung. Adobe hat das Problem als unlösbarer geschlossen, so dass dies mein letzter Ausweg war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top