10

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 が問題ない理由は、ブラウザーと Flash コンポーネントによって共有されるセッション/認証情報にあると思いますが、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 をどこに置くべきか尋ねてもよろしいですか。現在、crossdomain.xml を持っておらず、どこに置くべきかわからないためです。

4

9 に答える 9

19

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

次の点に注意してください。

  • なんらかの理由で、これはリクエストメソッドが POST の場合にのみ機能します。ヘッダーは GET リクエストで設定されません。

  • 興味深いことに、上記のように、少なくとも 1 つの URLVariables の名前と値のペアがリクエストにパッケージ化されていない限り、これも失敗します。そのため、(私のものも含めて) 多くの例で "name=John+Doe" が添付されています。これは、カスタム HTTP ヘッダーを設定するときに URLRequest が必要と思われるデータの単なるプレースホルダーです。これがないと、適切に認証された POST リクエストでも失敗します。

  • どうやら、Flash Player バージョン9.0.115.0はすべての Authorization ヘッダーを完全にブロックするようです (詳細については、こちらを参照)。

  • 送信するヘッダーに対応するために、ほぼ確実に 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> 

...そしてそれはうまくいくようです。これに関する詳細は、アドビのこちらから入手できます)。

上記のコードは Flash Player 10 (デバッグおよびリリース SWF を使用) でテストされているため、問題なく動作するはずですが、問題が発生した場合に備えて、元の投稿を更新して、この追加情報をすべて含めるようにしたいと思いました。 (悲しいことに)そうなるでしょう。

それが役に立てば幸い!幸運を。コメントには気をつけます。

于 2009-02-03T23:19:20.613 に答える
3

FileReference.upload()およびFileReference.download()メソッドは、URLRequest.requestHeadersパラメーターをサポートしていません。

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

于 2009-07-31T06:38:04.737 に答える
2

ファイルをアップロードする場合は、UploadPostHelper クラスを介して URLRequest を使用して、正しいヘッダーとファイルのコンテンツを送信するだけです。これは 100% 動作します。このクラスを使用して、生成された画像と CSV ファイルをアップロードしていますが、どのような種類のファイルもアップロードできます。

このクラスは、html フォームからファイルをアップロードするかのように、ヘッダーとコンテンツを使用してリクエストを準備するだけです。

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);
于 2012-10-17T11:51:33.120 に答える
1

これについてはよくわかりませんが、url の先頭に username:password@ を追加してみましたか?

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

于 2009-05-22T11:18:05.440 に答える
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();
于 2009-07-28T14:19:35.420 に答える
0

一見同様の問題がここで解決されました。最初の投稿でリンクされているFlexcodersの投稿も確認することをお勧めします。

問題は、FireFox が別のブラウザ ウィンドウ インスタンスを使用してファイル アップロード リクエストを送信することでした。解決策は、セッション ID をリクエスト URL に手動で添付することです。セッション ID は、通常の GET 変数としてではなく、セミコロンでアタッチされます (この構文の理由は私にはわかりません)。

于 2009-05-26T18:52:12.277 に答える
0

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

これは IE ( http://www.theregister.co.uk/2004/01/30/ms_drop_authentication_technique/ ) では機能せず、Chrome でも機能しないようです。

おそらくFlashでは使えない

于 2010-03-10T15:30:22.613 に答える
0

ASP.Net を使用する場合の回避策は、ここでの作業の一部に基づいています。

UpdatePanels で使用できるように、Flex オブジェクトをページに動的に書き込むコンポーネントを作成しました。コードが必要な場合は、私にメッセージを送ってください。URLRequest によって認証 Cookie を送信する必要があるページで上記の問題を解決するために、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);

次に、Flex オブジェクトで、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;

最後に、global.asax BeginRequest に Cookie を詰め込みます

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時間を誰かが回避するのに役立つことを願っています. アドビはこの問題を解決できないとしてクローズしたので、これが私の最後の手段でした。

于 2010-07-08T21:55:18.983 に答える
0

Flash では、http 要求で渡すことができるヘッダーの種類が非常に限られています (ブラウザーと OS 間で異なります)。これが 1 つのブラウザ/OS で動作するようになった場合は、必ず他のブラウザ/OS でもテストしてください。

最善の方法は、HTTP ヘッダーをいじらないことです。

同じ問題 (Flash から Picasa ウェブ アルバムへのアップロード) があり、サーバーのプロキシ経由で投稿しています。追加のヘッダーを post パラメータとして渡すと、プロキシが正しいことを行います。

于 2009-05-27T17:06:14.037 に答える