문제

urlRequest를 사용하여 서버에 파일을 업로드하는 Flex 파일 업로드 스크립트가 있습니다. 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();
}

ActionScript / Flex와 관련하여 지식이 없다는 것을 지적해야하지만 업로드 스크립트를 약간 수정했지만 다소 수정되었습니다.

편집하다 - 아래 답변을 바탕으로 진행 상황에 대한 업데이트가 있습니다.

도와 주셔서 감사합니다. 코드를 구현하려고했지만 운이 없었습니다.

HTTP 인증 된 위치를 다룰 때 경험하고있는 일반적인 행동은 IE7을 사용하면 모든 것이 좋지만 파일을 서버에 업로드하려고 할 때 Firefox에서는 HTTP 인증 프롬프트가 표시됩니다. 업로드 프로세스.

IE7이 괜찮은 이유는 브라우저와 플래시 구성 요소가 공유하는 세션 / 인증 정보에 달려 있다고 생각합니다. 그러나 Firefox에서는 그렇지 않으며 위의 동작을 경험합니다.

다음은 변경 사항을 포함하여 업데이트 된 업로드 기능입니다.

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

명심해야 할 몇 가지 사항 :

  • 어떤 이유로 든 이것은 요청 방법이 게시되는 곳에서만 작동합니다. GET 요청으로 헤더가 설정되지 않습니다.

  • 흥미롭게도, 위에 표시된 것처럼 하나 이상의 urlvaribles name-value 쌍이 요청과 함께 포장되지 않는 한 실패합니다. 그렇기 때문에 당신이 볼 수있는 많은 예제 (광산 포함)가 "name = john+doe"를 첨부하는 이유입니다. 사용자 정의 HTTP 헤더를 설정할 때 UrlRequest가 요구하는 일부 데이터의 자리 표시 자일뿐입니다. 그것 없이는 제대로 인증 된 사후 요청조차 실패합니다.

  • 분명히 플래시 플레이어 버전 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> 

... 그리고 그것은 작동하는 것 같습니다. 이 정보에 대한 자세한 내용은 Adobe에서 제공됩니다 여기).

위의 코드는 Flash Player 10 (Debug & Release SWFS 포함)으로 테스트되었으므로 작동해야하지만 가능성이있는 경우이 추가 정보를 포함시키기 위해 원래 게시물을 업데이트하고 싶었습니다. (슬프게도) 당신이 할 가능성이 높습니다.

도움이되기를 바랍니다! 행운을 빕니다. 나는 의견을 주시 할 것이다.

다른 팁

filEerference.upload () 및 filereference.download () 메소드는 urlrequest.requestheaders 매개 변수를 지원하지 않습니다.

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

파일을 업로드하려면 UploadPosthelper 클래스를 통해 UrlRequest를 사용하여 올바른 헤더와 파일 내용을 보내면됩니다. 이것은 100%작동합니다.이 클래스를 사용하여 생성 된 이미지 및 CSV 파일을 업로드하지만 모든 종류의 파일을 업로드 할 수 있습니다.

이 클래스는 HTML 양식에서 파일을 업로드하는 것처럼 헤더 및 컨텐츠로 요청을 준비합니다.

http://code.google.com/p/asclublib/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);

확실하지 않지만 URL의 시작 부분에 사용자 이름 : password@을 추가해 보셨습니까?

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

겉보기에는 비슷한 문제가 해결되었습니다 여기. 나는 또한 당신에게도 확인할 것을 촉구합니다 FlexCoders 게시물 첫 번째 게시물에서 링크.

문제 Firefox는 별도의 브라우저 창 인스턴스를 사용하여 파일 업로드 요청을 보냅니다. 해결책 세션 ID를 요청 URL에 수동으로 첨부하는 것입니다. 세션 ID는 정기적 인 GET 변수로 첨부되지 않지만 세미콜론이 있습니다 (이 구문의 이유는 나에게 알려져 있지 않음).

Flash는 HTTP 요청으로 전달할 수있는 종류의 헤더와 관련하여 매우 제한적입니다 (브라우저와 OS간에 변경). 하나의 브라우저/OS에서 작동하도록하는 경우 다른 브라우저/OS에서 테스트해야합니다.

가장 좋은 방법은 HTTP 헤더를 엉망으로 만들지 않는 것입니다.

우리는 동일한 문제 (Flash에서 Picasa 웹 앨범에 업로드)를 가지고 있으며 서버의 프록시를 통해 게시합니다. 우리는 포스트 매개 변수로 추가 헤더를 통과시키고 프록시는 올바른 일을합니다.

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

이것은 IE에서 작동하지 않습니다 (http://www.theeregister.co.uk/2004/01/30/ms_drop_authentication_technique/) 그리고 크롬에서도 작동하지 않는 것 같습니다.

아마도 플래시에서 사용할 수 없을 것입니다

작업에 부분적으로 ASP.NET을 사용할 때의 작업은 다음과 같습니다. 여기.

Flex 객체를 페이지에 동적으로 쓸 수있는 구성 요소를 만들어 업데이트 패널에서 사용할 수 있습니다. 그들이 코드를 원한다면 저에게 메시지를 보내십시오. 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는 문제를 해결할 수없는 것으로 닫았으므로 이것이 나의 마지막 수단이었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top