2010-10-13 20 views
1

La référence Adobe indique spécifiquement cela comme une limitation.Téléchargement d'un fichier Adobe AIR/Flex sur un serveur nécessitant une authentification de base

Voici la note dans la fonctionnalité file.upload dans adobe reference. Remarque: Si votre serveur requiert une authentification utilisateur, seuls les fichiers SWF s'exécutant dans un navigateur, à l'aide du plug-in de navigateur ou du contrôle ActiveX, peuvent fournir une boîte de dialogue pour inviter l'utilisateur à saisir un nom d'utilisateur et un mot de passe. , et seulement pour les téléchargements. Pour les téléchargements utilisant le plug-in ou le contrôle ActiveX, ou pour les téléchargements et téléchargements à l'aide du lecteur autonome ou externe, le transfert de fichier échoue.

click here for the full reference page for File

Quelqu'un at-il été en mesure de contourner cette limitation. Une idée que j'ai eu était d'utiliser le support natif dans AIR pour Javascript et de voir ça fonctionne. Quelqu'un a essayé ça? Quelqu'un a d'autres idées?

J'ai également essayé la solution proposée here et cela n'a pas fonctionné. Selon l'interlocuteur du forum, cela ne semblait pas fonctionner pour lui non plus. Probablement frapper le problème/limitation mentionné ci-dessus.

Je comprends comment inclure l'authentification de base sur un URLRequest et cela fonctionne bien pour moi si je poste des paires clé/valeur. Mais quand je tente de télécharger un fichier, cela ne fonctionne pas. Il se trouve juste là et ne déclenche aucun des événements file.upload. Pas d'erreurs pas de progrès. Toute aide est très appréciée.

Voici mon exemple de code:

  var sendVars:URLVariables = new URLVariables(); 
     sendVars.prop1 = "filename" ; 

     var urlRequest:URLRequest = new URLRequest(); 
     urlRequest.method = URLRequestMethod.POST ; 
     urlRequest.data = sendVars ; 

     var encoder:Base64Encoder = new Base64Encoder(); 
     encoder.encode("user:pass"); 
     var credsHeader:URLRequestHeader = new URLRequestHeader("Authorization", "Basic " + encoder.toString());    

     urlRequest.requestHeaders.push(credsHeader); 

     file = new File(url); 

     file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA , file_UploadCompleteDataHandler);    
     file.addEventListener(Event.OPEN, fileOpenHandler); 
     file.addEventListener(ProgressEvent.PROGRESS, fileProgressHandler); 
     file.addEventListener(Event.COMPLETE, file_CompleteHandler); 
     file.addEventListener(IOErrorEvent.IO_ERROR, file_IOErrorHandler); 
     file.addEventListener(HTTPStatusEvent.HTTP_STATUS , file_HTTPStatusHandler); 
     file.addEventListener(SecurityErrorEvent.SECURITY_ERROR, file_SecurityErrorHandler); 

     try { 
      // Start the file upload 
      file.upload(urlRequest, "primaryFile", false); 
     } 
     catch (error:Error) { 
      trace("Unable to upload file." + file.name); 
     } 

Répondre

3

Faites exactement ce que vous faites, sauf obtenir le file.data et le transmettre dans ce ....

public static function prepareWithFormData(vars:MetadataList, bytes:ByteArray, fieldName:String, filename:String, request:URLRequest):void { 
     bytes.position = 0; 
     var boundary: String = '---------------------------' + UIDUtil.createUID(); 
     var header1: String = ""; 
     var varsArray:Array = vars.asArray(); 
     for each(var item:Metadata in varsArray) { 
      header1 += "\r\n--" + boundary + "\r\n"; 
      header1 += 'Content-Disposition: form-data; name="' + item.name + '"\r\n\r\n'; 
      header1 += item.value; 
     } 

     header1 += '\r\n--'+boundary + '\r\n' 
       +'Content-Disposition: form-data; name="' + fieldName + '"; filename="'+filename+'"\r\n' 
       +'Content-Type: application/octet-stream\r\n\r\n' 
     //In a normal POST header, you'd find the image data here 
     var header2:String = '\r\n--'+boundary + '--'; 

     //Encoding the two string parts of the header 
     var headerBytes1: ByteArray = new ByteArray(); 
     headerBytes1.writeMultiByte(header1, "ascii"); 

     var headerBytes2: ByteArray = new ByteArray(); 
     headerBytes2.writeMultiByte(header2, "ascii"); 

     //Creating one final ByteArray 
     var sendBytes: ByteArray = new ByteArray(); 
     sendBytes.writeBytes(headerBytes1, 0, headerBytes1.length); 
     sendBytes.writeBytes(bytes, 0, bytes.length); 
     sendBytes.writeBytes(headerBytes2, 0, headerBytes2.length); 

     request.data = sendBytes; 
     request.method = URLRequestMethod.POST; 
     request.contentType = "multipart/form-data; boundary=" + boundary; 
    } 
+0

Voulez-vous dire que je devrais faire exactement ce que je fais avec le URLRequest mais au lieu d'utiliser file.upload je devrais faire ceci: – Saviz

+0

Désolé le dernier commentaire a été coupé avant que j'aie fini avec lui: Voulez-vous dire que je devrais faire exactement ce que je fais avec le URLRequest mais au lieu d'utiliser file.upload je devrais utiliser URLRequest et remplir son .data comme vous le suggérez ré. Comment puis-je l'envoyer si ce n'est via le fichier file.upload. Quel chargeur dois-je utiliser? – Saviz