9

サーバーにファイルをアップロードするフレックスアプリがあります。サーバーがアップロードできるようにするには、認証が必要です。IEでは、アップロードは正常に機能します。ただし、FFとSafariではアップロードされません。私はこれと同じ問題を抱えている人々を見てきましたが、答えはありません。今私を失敗しないでくださいstackoverflowers。

4

10 に答える 10

3

少なくとも Firefox での問題は、FileReference.upload() を呼び出したときにセッション Cookie がリクエストで送信されないことです。必要なことは、認証トークンをフォーム変数として、またはクエリ文字列に追加することです。セッション Cookie が「jsessionid」と呼ばれる Java の例を次に示します。

var request : URLRequset = new URLRequest( uploadUrl + ";jsessionid=" + jsessionid);

Javascript と ExternalInterface を使用して Cookie から jsessionid を解析し、Javascript 関数を呼び出すことができます。または、認証後に、現在のセッション ID を返すバックエンド メソッドを Flex に呼び出させることができます。

関連する Flex のバグは次のとおりです。

http://bugs.adobe.com/jira/browse/FP-201

于 2008-12-09T02:29:09.170 に答える
3

自分で答えを見つけようとしているときに、この質問を見つけました。解決策はかなり単純でした。

他の人がリンクしたFlash Player のバグとそのページのコメントに基づいて、アップロード URL にセッション ID を追加して試してみることにしました。本当に簡単でした!

これを機能させるために、sessionParams という flashVar パラメータを追加することから始めました。これにより、必要な任意の文字列をセッション ID として Flash Player に渡すことができ、後でアップロードに使用する URL に追加されます。

//sessionParams - resolves firefox upload bug
public var sessionParams:String = "";

//...

public function initApp():void{
    sessionParams = Application.application.parameters.sessionParams;
}

私の場合、Java セッションを有効にして ColdFusion を使用しているためsessionParams、Flash Player に渡す前に次のようにセットアップします。

<cfset flashVars = "sessionParams=#urlEncodedFormat('jsessionid=' & session.sessionid)#" />

=、& など (urlEncodedFormat で行った) などの特殊文字をエスケープすることを忘れないでください。これにより、それらは「sessionParams」パラメーターの値の一部として扱われ、他のパラメーターを示すブレークポイントとして扱われなくなります。現在の URL に将来の URL 情報を埋め込んでいます。

次に、アップロード コードで sessionParams 値を使用します。これが私の設定方法のスニペットです:

// Set Up URLRequest
_uploadURL = new URLRequest;
_uploadURL.url = _url + "?" + _sessionParams;
_uploadURL.method = "GET";
_uploadURL.data = _variables;
_uploadURL.contentType = "multipart/form-data";

これは再利用可能なクラスの一部であるため、変数名は異なります (ただし類似しています)。

うまくいけば、それはあなたを助けます。そうでない場合は、私に知らせてください。あなたを助けるために、より多くのコードまたは説明を提供しようとします.

于 2009-03-26T13:44:40.337 に答える
1

同じ問題に直面しました。ファイルのアップロードは、Firefoxを除くすべてのブラウザで機能していました。Firefoxで、ファイルのアップロード中にエラー#2038がスローされていました。アプリケーションはSSLを使用していました。私の場合、Firefoxからアップロードリクエストが生成されていなかったので、firebugのネットパネルで確認できましたが、アップロードURLはヒットしていませんでした。つまり、Firefoxのフラッシュランタイムがアップロードリクエストをブロックしていた可能性があります。しかし、IEでアプリケーションを実行し、IEにアプリケーションの自己署名証明書をインストールすると、ファイルのアップロードがあいまいになり、もちろん驚くべきことに、Firefoxで動作し始めました。最初に、リクエストがサーバーに到達しているか、でブロックされているかどうかを確認してください。クライアント。

ありがとう

于 2012-11-01T06:36:36.437 に答える
1

私はこの問題を解決しました。flexを使用したファイルのアップロードは、すべてのブラウザで機能します。J2eeアプリケーションでは、

security-constraintにコメントを付けるか、実際のコードを配置するweb.xmlでfileupload.doURLを保護しないようにします。

<security-constraint>
    <display-name>Senusion Security Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>Un Protected Area</web-resource-name>
          <url-pattern>/fileupload.do</url-pattern>
      </web-resource-collection>
</security-constraint> 

これが次の読者に役立つことを願っています。

于 2010-05-29T02:03:05.873 に答える
1

Flex と Java Web フィルターを使用して、このバグを回避することができました

フレックスコード:

var urlVars:URLVariables = new URLVariables();
urlVars.jsessionid = sessionID;

var uploadUrl:String = "http://localhost:8080/mywar;jsessionid="+sessionID;
uploadUrl += "?"+getClientCookies(); //put all client cookies on the query string 
var urlRequest:URLRequest = new URLRequest(uploadUrl);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = urlVars;

//will go first time and get the cookies set see flex docs  
var testUpload:Boolean = true; 
fileRef.upload(urlRequest,"Filedata",testUpload);

ジャバコード:

package com.mywar.fileupload;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author orasio - spieler
 * This filter comes to solve the Firefox ,Chrome and SAFARI file upload issue
 * The problem was that the file uploaded by the flex 
 * FileReference came with a different session and no cookies
 * To solve this problem do the following : 
 * 
 * 
 * don't forget to add this filter to the web.xml file
 */
public class FileUploadFilter implements Filter {

    private static final String CONTENT_LENGTH = "content-length";
    private static final String UPLOAD_SITE_PATH = "/";
    private static final String JSESSIONID = "JSESSIONID";


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, 
                 ServletResponse response,
                 FilterChain filterChain) 
                 throws IOException, ServletException {
        if ((request instanceof HttpServletRequest) 
         && (response instanceof HttpServletResponse)) {
            HttpServletRequest httpRequest = (HttpServletRequest) request;

            //httpRequest.getHeader("user-agent");  //Shockwave Flash
            String contentLength = httpRequest.getHeader(CONTENT_LENGTH);
            boolean isFlexTest = (contentLength!=null 
                      && Integer.parseInt(contentLength)==0); 
            if(isFlexTest){ 
               HttpServletResponse httpResponse = 
                                            (HttpServletResponse) response;
               setAllClientCookie((HttpServletResponse)response, httpRequest);
               PrintWriter out = httpResponse.getWriter();
               out.println("OK");
               out.close();
               return;
            }
        }
        filterChain.doFilter(request, response);
    }

    /*
     * write all cookies back to the flex test response 
     */
    @SuppressWarnings("unchecked")
    private void setAllClientCookie(HttpServletResponse httpResponse,
                    HttpServletRequest httpRequest) {
        Enumeration<String> parameterNames = 
                (Enumeration<String>)httpRequest.getParameterNames();
        while (parameterNames.hasMoreElements()) {
           String cookieName = (String) parameterNames.nextElement();
     //since we get IllegalArgumentException: Cookie name "JSESSIONID" is a reserved token

           if(!cookieName.contains(JSESSIONID)) { 
              Cookie cookie = 
                          new Cookie(cookieName, httpRequest.getParameter(cookieName));
              cookie.setPath(UPLOAD_SITE_PATH);
              httpResponse.addCookie(cookie);
           }
        }
    }

    @Override
    public void destroy() {
    }

}
于 2011-03-17T20:36:09.700 に答える
1

FlashPlayer 10 は、非常に役立つ新しい Filereference API を提供します。これについて説明しているブログ エントリがあります: http://www.flexpasta.com/index.php/2010/02/21/uploading-files-with-firefox-solution/

実際、Flash 10 では、flash.net.FileReference の機能強化により、アップロード前にファイルの内容を読み取ることができます。つまり、ファイルはさまざまな方法でアップロードでき、Flash 9 で実行できます。次の例は、ファイルのアップロードがいかに簡単で、SSL、Firefox、IE、Chrome などに縛られていないことを示しています。

于 2010-08-04T11:38:50.817 に答える
0

これは実際のFlashPlayerのバグです。多分このリンクはあなたにいくつかのアイデアを与えるでしょう。

サーバー側には何がありますか?たぶん、リクエストのパラメータとしてセッションIDを追加することができます。

于 2009-03-09T23:08:19.267 に答える
0

これはかなり古いように見えますが、私も最近この問題に遭遇しました。Flex +認証済みRailsセットアップでの私の修正(最適にはほど遠い)は、アップロードスクリプトでセッションベースの認証をオフにすることでした。

少なくとも基本認証が本当に必要だったので、ユーザーがログインしたときに使用したユーザー名とパスワードを保存し、レール側で手動で送信/検証するためのコードを記述しました。フラッシュはブラウザセッションにアクセスできないため、「jsessionid」ハックを機能させることはできませんでした。

これが誰かが少し時間を節約するのに役立つことを願っています。

于 2009-03-09T21:49:02.640 に答える
0

URL を介して Cookie を送信しても、機能しない場合があります。これは、Flex がファイル アップロード リクエストをブロックしているためです。

ブロックを解除するには、SSL 証明書をインストールしてから試す必要があります。

誰かが他の答えを持っている場合は、私に知らせてください。

于 2012-11-01T08:27:03.593 に答える