サーバーにファイルをアップロードするフレックスアプリがあります。サーバーがアップロードできるようにするには、認証が必要です。IEでは、アップロードは正常に機能します。ただし、FFとSafariではアップロードされません。私はこれと同じ問題を抱えている人々を見てきましたが、答えはありません。今私を失敗しないでくださいstackoverflowers。
10 に答える
少なくとも Firefox での問題は、FileReference.upload() を呼び出したときにセッション Cookie がリクエストで送信されないことです。必要なことは、認証トークンをフォーム変数として、またはクエリ文字列に追加することです。セッション Cookie が「jsessionid」と呼ばれる Java の例を次に示します。
var request : URLRequset = new URLRequest( uploadUrl + ";jsessionid=" + jsessionid);
Javascript と ExternalInterface を使用して Cookie から jsessionid を解析し、Javascript 関数を呼び出すことができます。または、認証後に、現在のセッション ID を返すバックエンド メソッドを Flex に呼び出させることができます。
関連する Flex のバグは次のとおりです。
自分で答えを見つけようとしているときに、この質問を見つけました。解決策はかなり単純でした。
他の人がリンクした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";
これは再利用可能なクラスの一部であるため、変数名は異なります (ただし類似しています)。
うまくいけば、それはあなたを助けます。そうでない場合は、私に知らせてください。あなたを助けるために、より多くのコードまたは説明を提供しようとします.
同じ問題に直面しました。ファイルのアップロードは、Firefoxを除くすべてのブラウザで機能していました。Firefoxで、ファイルのアップロード中にエラー#2038がスローされていました。アプリケーションはSSLを使用していました。私の場合、Firefoxからアップロードリクエストが生成されていなかったので、firebugのネットパネルで確認できましたが、アップロードURLはヒットしていませんでした。つまり、Firefoxのフラッシュランタイムがアップロードリクエストをブロックしていた可能性があります。しかし、IEでアプリケーションを実行し、IEにアプリケーションの自己署名証明書をインストールすると、ファイルのアップロードがあいまいになり、もちろん驚くべきことに、Firefoxで動作し始めました。最初に、リクエストがサーバーに到達しているか、でブロックされているかどうかを確認してください。クライアント。
ありがとう
私はこの問題を解決しました。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>
これが次の読者に役立つことを願っています。
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() {
}
}
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 などに縛られていないことを示しています。
これは実際のFlashPlayerのバグです。多分このリンクはあなたにいくつかのアイデアを与えるでしょう。
サーバー側には何がありますか?たぶん、リクエストのパラメータとしてセッションIDを追加することができます。
これはかなり古いように見えますが、私も最近この問題に遭遇しました。Flex +認証済みRailsセットアップでの私の修正(最適にはほど遠い)は、アップロードスクリプトでセッションベースの認証をオフにすることでした。
少なくとも基本認証が本当に必要だったので、ユーザーがログインしたときに使用したユーザー名とパスワードを保存し、レール側で手動で送信/検証するためのコードを記述しました。フラッシュはブラウザセッションにアクセスできないため、「jsessionid」ハックを機能させることはできませんでした。
これが誰かが少し時間を節約するのに役立つことを願っています。
URL を介して Cookie を送信しても、機能しない場合があります。これは、Flex がファイル アップロード リクエストをブロックしているためです。
ブロックを解除するには、SSL 証明書をインストールしてから試す必要があります。
誰かが他の答えを持っている場合は、私に知らせてください。