2009-02-03 8 views
10

मेरे पास एक फ्लेक्स फ़ाइल अपलोड स्क्रिप्ट है जो सर्वर पर फ़ाइलों को अपलोड करने के लिए URLRequest का उपयोग करती है। मैं http प्रमाणीकरण (सर्वर पर पासवर्ड संरक्षित निर्देशिका) के लिए समर्थन जोड़ना चाहता हूं, लेकिन मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए - मुझे लगता है कि मुझे कक्षा को किसी भी तरह विस्तारित करने की आवश्यकता है, लेकिन मैं थोड़ा खो गया हूं।फ्लेक्स 3 - HTTP प्रमाणीकरण URLRequest का समर्थन कैसे करें?

मैंने निम्नलिखित को संशोधित करने की कोशिश की (URLRequest के साथ HTTPService को बदलना), लेकिन यह काम नहीं किया।

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

मैं, बाहर बिंदु चाहिए कि मैं जानकार नहीं हूँ जब यह ActionScript/फ्लेक्स के लिए आता है, हालांकि मैं सफलतापूर्वक कुछ हद तक अपलोड स्क्रिप्ट को संशोधित करने में कामयाब रहे है।

आपकी सहायता के लिए धन्यवाद: -

[संपादित करें] यहाँ मेरी प्रगति, नीचे दिए गए उत्तर के आधार पर की एक अद्यतन है, हालांकि मैं अभी भी इस काम करने के लिए नहीं मिल सकता है। मैंने आपके कोड को लागू करने का प्रयास किया है लेकिन मुझे कोई भाग्य नहीं मिला है।

HTTP प्रमाणीकृत स्थानों से निपटने के दौरान मुझे लगता है कि सामान्य व्यवहार यह है कि आईई 7 के साथ सभी ठीक है लेकिन फ़ायरफ़ॉक्स में जब मैं सर्वर पर फ़ाइल अपलोड करने का प्रयास करता हूं तो यह एक HTTP प्रमाणीकरण संकेत प्रदर्शित करता है - जो सही होने पर भी विवरण, बस अपलोड प्रक्रिया को रोकता है।

मुझे विश्वास है कि IE7 ठीक है कारण ब्राउज़र/फ्लैश घटक द्वारा साझा सत्र/प्रमाणीकरण जानकारी के नीचे है - हालांकि, फ़ायरफ़ॉक्स में यह मामला नहीं है और मुझे उपर्युक्त व्यवहार का अनुभव है।

यहाँ मेरी अद्यतन अपलोड समारोह है, अपने परिवर्तनों को शामिल:

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); 
    } 
} 

जैसा कि ऊपर कहा, मैं के साथ या मेरे समारोह में संशोधन के बिना ही परिणाम का सामना कर रहे हैं।

क्या मैं यह भी पूछ सकता हूं कि crossdomain.xml कहाँ स्थित होना चाहिए - क्योंकि मेरे पास वर्तमान में कोई नहीं है और यह सुनिश्चित नहीं है कि इसे कहां रखा जाए।

+0

crossdomain.xml अपने वेब अनुप्रयोग की रूट निर्देशिका में रखा जाना चाहिए। तो अगर जिसमें फ़ाइलों www.yoursite.com डी में स्थित हैं: \ वेबसाइटों \ yoursite.com, फ़ाइल के पथ d किया जाना चाहिए: \ वेबसाइटों \ yoursite.com \ crossdomain.xml। –

+0

अपने corssdomain.xml फ़ाइल रखकर के अलावा (जो आपको क्या करना चाहिए), तुम्हें पता है जो फ़्लैश प्लेयर संस्करण आप स्थापित हो गया गया है करते हैं? क्या आपने सुनिश्चित किया है कि आप फ़्लैश प्लेयर 10 का उपयोग कर रहे हैं? (ऐसा लगता है कि मेरे निष्कर्ष यह थे कि फ़्लैश प्लेयर 9 कस्टम प्राधिकरण शीर्षलेखों के साथ अच्छा नहीं खेलता है।) –

+0

आपकी मदद के लिए धन्यवाद ईसाई - दुर्भाग्य से, मुझे आगे परीक्षण करने का मौका नहीं मिला है (किसी अन्य प्रोजेक्ट के साथ घिरा हुआ है) लेकिन मैं एक कोशिश करूँगा मुझे अवसर मिल जाएगा। – BrynJ

उत्तर

18

वाक्य रचना URLRequest के लिए थोड़ा अलग है, लेकिन यह विचार ही है:

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); 
} 

ध्यान में रखने की कुछ बातें: किसी कारण से,

  • बेस्ट मैं बता सकता हूँ , यह केवल तभी काम करता है जहां अनुरोध विधि पोस्ट की जाती है; हेडर जीईटी अनुरोधों के साथ सेट नहीं होते हैं।

  • दिलचस्प बात यह है कि यह तब तक विफल रहता है जब तक कम से कम एक URLVariables नाम-मूल्य जोड़ी ऊपर दिए गए अनुसार अनुरोध के साथ पैक नहीं हो जाती है। यही कारण है कि आप वहां से कई उदाहरण देख रहे हैं (मेरा सहित) "name = John + Doe" संलग्न करते हैं - यह केवल कुछ डेटा के लिए प्लेसहोल्डर है जो किसी कस्टम HTTP शीर्षलेख को सेट करते समय URLRequest की आवश्यकता होती है। इसके बिना, यहां तक ​​कि एक उचित प्रमाणीकृत पोस्ट अनुरोध भी असफल हो जाएगा।

  • जाहिर है, फ़्लैश प्लेयर संस्करण 9.0.115.0 पूरी तरह से ब्लॉक सभी प्राधिकरण हेडर (यह एक here बारे में अधिक जानकारी) है, तो आप शायद बहुत बात का ध्यान रखना है, चाहता हूँ।

  • आपको लगभग निश्चित रूप से अपने क्रॉसडोमेन को संशोधित करना होगा।आप जिस हेडर को भेज रहे हैं उसे समायोजित करने के लिए xml फ़ाइल। मेरे मामले में, मैं इसका उपयोग कर रहा हूं, जो एक व्यापक रूप से खुली नीति फ़ाइल है जिसमें यह किसी भी डोमेन से स्वीकार करता है, इसलिए आपके मामले में, आप चीजों को थोड़ा और सीमित करना चाहते हैं, इस पर निर्भर करता है कि आप कितने सुरक्षा-जागरूक हैं ।

crossdomain.xml:

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

... और कहा कि काम करने के लिए लगता है, इस पर अधिक जानकारी एडोब here से उपलब्ध है)।

उपरोक्त कोड का परीक्षण फ्लैश प्लेयर 10 (डीबग & रिलीज एसडब्ल्यूएफ के साथ) के साथ किया गया था, इसलिए इसे आपके लिए काम करना चाहिए, लेकिन अगर आप किसी भी मुद्दे पर चलते हैं तो यह अतिरिक्त जानकारी शामिल करने के लिए मैं अपनी मूल पोस्ट अपडेट करना चाहता था, क्योंकि संभावनाएं (उदास) संभावना है कि आप करेंगे।

उम्मीद है कि यह मदद करता है! सौभाग्य। मैं टिप्पणियों के लिए नजर रखूंगा।

+0

एक ही चीज़ के लिए सलाह के टन लेकिन एसडीके 4.6 के साथ सरल फ्लेक्स एप्लिकेशन के लिए काम करने वाला एकमात्र असली कामकाजी उत्तर। आपका बहुत बहुत धन्यवाद। – serkan

+0

यह एएस 3 विचार के साथ काम करता है और साथ ही धन्यवाद। – sputn1k

1

मुझे इस बारे में निश्चित नहीं है, लेकिन क्या आपने अपना यूआरएल की शुरुआत में उपयोगकर्ता नाम: पासवर्ड @ जोड़ने का प्रयास किया है?

"http://username:[email protected]/yourservice.ext"

+0

इसका उपयोग एक जीईटी अनुरोध – Arpit

+0

का उपयोग करके प्राधिकरण जानकारी भेजने का एकमात्र तरीका प्रतीत होता है स्पष्ट रूप से यह एक पुराना धागा है, लेकिन इसे वहां फेंक रहा है कि 'उपयोगकर्ता नाम: पासवर्ड @ ...' जोड़ने की यह विधि मेरे लिए काम करती है, जबकि मूल एथ हेडर जोड़ना मेरे एआईआर ऐप में प्रमाणीकरण संवाद प्रदर्शित किए बिना काम नहीं करता था। – dierdre

0

कदाचित समान समस्या here हल किया गया था। मैं आपको पहले पोस्ट में जुड़े Flexcoders post को भी जांचने का आग्रह करता हूं।

समस्या यह था कि फ़ायरफ़ॉक्स फ़ाइल अपलोड अनुरोध भेजने के लिए एक अलग ब्राउज़र विंडो उदाहरण का उपयोग करता है। समाधान मैन्युअल रूप से अनुरोध URL पर सत्र आईडी संलग्न करना है। सत्र आईडी नियमित जीईटी चर के रूप में संलग्न नहीं है, लेकिन अर्धविराम के साथ (इस वाक्यविन्यास का कारण मुझे अज्ञात है)।

+0

मुझे इस सत्र के मुद्दे का भी सामना करना पड़ा, और इसी तरह के समाधान के साथ आया, लेकिन यह समस्या का सामना नहीं कर रहा है - जो विशेष रूप से HTTP प्रमाणीकरण (इस तरह से संबंधित सत्र नहीं) है। – BrynJ

0

फ्लैश बहुत सीमित है कि आप किस प्रकार के शीर्षलेख http अनुरोध के साथ पास कर सकते हैं (और यह ब्राउज़र और ओएस के बीच बदलता है)। यदि आप इसे एक ब्राउज़र/ओएस पर काम करने के लिए प्राप्त करते हैं, तो सुनिश्चित करें कि आप इसे दूसरों पर परीक्षण करें।

करने के लिए सबसे अच्छी बात HTTP शीर्षलेखों के साथ गड़बड़ नहीं है।

हमारे पास एक ही समस्या है (फ्लैश से Picasa वेब एल्बम पर अपलोड करना) और हमारे सर्वर पर प्रॉक्सी के माध्यम से पोस्ट करें। हम पोस्ट पैरामीटर के रूप में अतिरिक्त हेडर पास करते हैं और हमारी प्रॉक्सी सही चीज करता है।

1
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(); 
+0

अरे दोस्तों, आपके विचारों के लिए धन्यवाद, मैं URLRequest के बजाय HTTPService का उपयोग करने के लिए हैक के साथ आने का प्रबंधन करता हूं। मैंने जो कुछ किया है वह एक service.request के माध्यम से चर जोड़ रहा था, और set.method = 'POST' आशा है कि मदद करें !!! :) –

0

"http://username:[email protected]/yourservice.ext"

यह आईई (http://www.theregister.co.uk/2004/01/30/ms_drop_authentication_technique/) में काम नहीं करता है और क्रोम में काम करने के लिए या तो प्रतीत नहीं होता। जब काम here पर आधारित ASP.Net का उपयोग कर

नहीं

शायद फ्लैश

0

यहाँ में प्रयोग करने योग्य के आसपास काम एक है।

मैंने एक घटक बनाया जो पृष्ठ पर फ्लेक्स ऑब्जेक्ट्स को गतिशील रूप से लिखता है ताकि उन्हें अपडेटपेनल्स में उपयोग किया जा सके। अगर आप उन्हें कोड चाहते हैं तो मुझे संदेश भेजें।उन पृष्ठों में उपर्युक्त समस्या को हल करने के लिए जहां URLRequest द्वारा प्रमाणीकरण कुकीज़ को भेजने की आवश्यकता होगी, मैं मानों को FlashVars के रूप में जोड़ता हूं।

इस कोड को केवल मेरे वस्तु में काम करता है, लेकिन आप विचार

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); 

तो फ्लेक्स वस्तु में मिलता है, परम

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; 

के लिए जाँच अंत में 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) { } 

} 

आशा है कि इससे किसी को 6 घंटे से बचने में मदद मिलेगी, जिसे मैंने अभी संबोधित किया है। एडोब ने इस मुद्दे को अनजान के रूप में बंद कर दिया है, इसलिए यह मेरा आखिरी उपाय था।

2

आप किसी फ़ाइल को अपलोड करना चाहते हैं, तो आप सिर्फ सही हेडर और UploadPostHelper वर्ग के माध्यम से URLRequest का उपयोग कर फ़ाइल की सामग्री भेजने की जरूरत है। यह 100% काम करता है, मैं जेनरेट की गई छवियों और सीएसवी फाइलों को अपलोड करने के लिए इस कक्षा का उपयोग कर रहा हूं, लेकिन आप किसी भी प्रकार की फाइल अपलोड कर सकते हैं।

इस वर्ग के बस हेडर और सामग्री के रूप में यदि आप एक एचटीएमएल रूप से फ़ाइल को अपलोड किया जाएगा के साथ अनुरोध तैयार करता है।

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); 
संबंधित मुद्दे