سؤال

لدي فليكس تحميل الملف النصي الذي يستخدم URLRequest لتحميل الملفات إلى الخادم.أريد أن أضيف دعم مصادقة http (كلمة السر المحمية الدلائل على الملقم) ، ولكن لا أعرف كيفية تنفيذ هذا - أعتقد أنني بحاجة إلى تمديد الفصل بطريقة ما ، لكن كيف أنا فقدت قليلا.

حاولت تعديل التالية (استبدال HTTPService مع URLRequest), ولكن ذلك لم ينجح.

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

وأود أن أشير إلى أنني لست على دراية عندما يتعلق الأمر أكشن / فليكس, على الرغم من أنني تمكنت من تعديل بنجاح تحميل البرنامج النصي إلى حد ما.

[عدل] هنا هو تحديث عن التقدم المحرز في بلدي ، استنادا إلى الإجابة أدناه ، على الرغم من أنني لا تزال لا يمكن الحصول على هذا العمل:

شكرا لك على المساعدة.لقد حاولت تنفيذ التعليمات البرمجية الخاصة بك ولكن ليس لدي أي حظ.

العامة السلوك تعاني أنا عند التعامل مع HTTP مصادقة المواقع هو أنه مع IE7 كل شيء على ما يرام ولكن في فايرفوكس عند محاولة تحميل ملف إلى ملقم فإنه يعرض مصادقة 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 يجب أن يكون موجودا - كما لا أملك حاليا واحدة وأنا متأكد من أين وضعه.

هل كانت مفيدة؟

المحلول

بناء الجملة هو مختلفة قليلا عن 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=جون+دو" -- انها مجرد نائب عن بعض البيانات التي URLRequest يبدو أن تتطلب عندما وضع أي مخصص رؤوس صفحات HTTP.دون ذلك, حتى بشكل صحيح مصادقة طلب POST سوف تفشل أيضا.

  • على ما يبدو, فلاش بلاير الإصدار 9.0.115.0 كتل تماما كل تصريح رؤوس (المزيد من المعلومات عن هذا واحد هنا), لذلك عليك ربما تريد أن تبقي في الاعتبار أيضا.

  • سوف يكون بالتأكيد إلى تعديل crossdomain.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> 

...ويبدو أن العمل ؛ مزيد من المعلومات حول هذا واحد هو متاح من أدوبي هنا).

رمز أعلاه تم اختباره مع فلاش لاعب 10 (مع التصحيح & الإفراج عن صناديق الثروة السيادية) ، لذلك يجب العمل بالنسبة لك, ولكن أردت أن تحديث منصبي الأصلي ليشمل جميع هذه معلومات اضافية في حال واجهت أي مشاكل ، كما أن فرص يبدو (للأسف) من المرجح أنه سوف.

نأمل أن يساعد!حظا سعيدا.سوف ترقب التعليقات.

نصائح أخرى

ووFileReference.upload () وFileReference.download () أساليب لا تدعم المعلمة URLRequest.requestHeaders.

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

إذا كنت ترغب في تحميل ملف، تحتاج فقط لإرسال رؤوس الصحيحة ومحتوى ملف باستخدام URLRequest عبر الطبقة UploadPostHelper. هذا وتعمل 100٪، أنا باستخدام هذه الفئة لتحميل الصور ولدت وملفات CSV، ولكن هل يمكن تحميل أي نوع من الملفات.

وهذه الفئة تعد مجرد الطلب مع رؤوس والمحتوى كما لو كنت سيتم تحميل الملف من شكل أتش تي أم أل.

HTTP: // التعليمات البرمجية. 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);

وأنا لست متأكدا من ذلك ولكن هل حاولت إضافة اسم المستخدم: كلمة المرور @ إلى بداية عنوان موقعك

و" HTTP: // اسم المستخدم: 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();

التي تبدو مماثلة المشكلة تم حلها هنا.أحثكم أيضا التحقق Flexcoders بعد مرتبطة في المشاركة الأولى.

المشكلة كان فايرفوكس يستخدم نافذة مستعرض منفصلة سبيل المثال لإرسال تحميل ملف الطلب. الحل هو يدويا إرفاق معرف جلسة العمل إلى طلب عنوان url.معرف جلسة العمل لا تعلق العادية الحصول على متغير, ولكن مع فاصلة منقوطة (والسبب في هذه الجملة هو غير معروف بالنسبة لي).

وفلاش محدودة جدا من حيث ما نوع من رؤوس يمكنك تمرير مع طلب HTTP (ويتغير بين المتصفحات وأنظمة تشغيل). إذا كنت الحصول على هذا العمل على واحد المتصفح / OS، تأكد من اختبار على الآخرين.

وأفضل شيء نفعله هو لا تعبث مع رؤوس HTTP.

لدينا نفس القضية (بتحميلها إلى ألبومات الويب بيكاسا من فلاش) والرد من خلال وكيل على الخادم لدينا. نحن نمر رؤوس إضافية من خلال لان منصب المعلمات ووكيل لدينا يفعل الشيء الصحيح.

وهنا هو عمل حول عند استخدام ASP.Net تستند في جزء منها على العمل هنا .

ولقد بنيت المكون الذي يكتب حيوي الأجسام فليكس إلى الصفحة بحيث يمكن استخدامها في UpdatePanels. رسالة لي إذا كنت تريد أنهم التعليمات البرمجية. لحل المشكلة أعلاه في الصفحات التي سوف تحتاج الكوكيز التوثيق ليتم إرسالها من قبل 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 ساعات قضيت فقط معالجة هذه. Adobe وقد أغلقت القضية باعتبارها غير القابلة للحل، لذلك كان هذا المنتجع تقريري الأخير.

scroll top