2008-12-08 8 views
9

Mam elastyczną aplikację, która ładuje pliki na serwer. Serwer wymaga uwierzytelnienia, aby móc przesłać. W IE przesyłanie działa dobrze. Jednak w FF i Safari nie przesyła. Widziałem ludzi z tym samym problemem, ale bez odpowiedzi. Nie zawiedź mnie teraz stackoverflowers.Jak sprawić, aby przesyłanie plików Flex działało na firefox i safari?

+0

Ja zamierzam pracować nad tym, aby omijać ten problem osobiście przez najbliższe tygodnie, a ja opowiem o wszelkich sukcesach i porażkach, które mam. –

+0

Bez dodatkowych informacji to pytanie jest prawie niemożliwe. Czy używasz komponentu napisanego przez kogoś innego lub swojego? Czy uwierzytelnianie działa we wszystkich przeglądarkach? Masz fragment kodu? Jakiś pomysł, gdzie kod się zatrzymuje/bombarduje? –

Odpowiedz

3

Znalazłem to pytanie, próbując znaleźć odpowiedź sam. Rozwiązanie było raczej proste.

Na podstawie flash player bug, które inni powiązali, oraz komentarzy na tej stronie, postanowiłem dołączyć identyfikatory sesji do mojego adresu URL przesyłania i dać mu szansę. To naprawdę było takie proste!

Aby działało, zacząłem od dodania parametru flashVar o nazwie sessionParams. Pozwoliło mi to przekazać dowolny ciąg do odtwarzacza Flash jako mojego identyfikatora sesji, a później zostanie dołączony do adresu URL, który został użyty do przesłania.

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

//... 

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

W moim przypadku, jestem na ColdFusion z sesji Java aktywna, więc moja sessionParams są ustawione jak następuje zanim przeszedł do odtwarzacza Flash:

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

Nie zapomnij uciec znaki specjalne, takie jak =, &, itp. (co zrobiłem z urlEncodedFormat), tak aby były traktowane jako część wartości parametru "sessionParams", a nie jako punkty przerwania wskazujące inne parametry. Osadzasz informacje o przyszłym adresie URL w bieżącym adresie URL.

Następnie użyj wartości sessionParams w swoim kodzie importowania.Oto fragment jak moja konfiguracja:

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

Nazwy zmiennych są różne (ale podobne), ponieważ jest to część klasy wielokrotnego użytku.

Mam nadzieję, że to pomaga. Jeśli nie, daj mi znać, a postaram się dostarczyć więcej kodu lub wyjaśnienia, które ci pomogą.

+0

Niestety używam .net. Jednak używam podobnej metody, którą znalazłem w tym pytaniu http://stackoverflow.com/questions/43324/can-i-put-an-asp-net-session-id-in-a-hidden-form-field – smartdirt

+1

Niestety, to nie działa, jeśli plik cookie JSESSIONID jest ustawiony na httponly, co jest zalecaną konfiguracją dla bezpieczeństwa (aby zapobiec XSS). –

+0

Nie wspominając, że wysyłanie identyfikatorów sesji w adresie URL wystawia sesję pośrednikom (np. Pamięci podręcznej) lub innym osobom (np. Za pośrednictwem dzienników żądań, monitoringu, analiz). –

3

Problem w przeglądarce Firefox jest taki, że pliki cookie sesji nie są wysyłane w żądaniu podczas wywoływania FileReference.upload(). To, co musisz zrobić, to dodać token uwierzytelniania jako zmienną formularza lub w ciągu zapytania. Oto przykład w Javie, gdzie cookie sesji jest nazywany „JSESSIONID”

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

Można analizować JSESSIONID z plików cookie przy użyciu JavaScript i ExternalInterface w celu wywołania funkcji JavaScript. Lub po uwierzytelnieniu możesz mieć wywołanie Flex metody backend, która zwraca bieżący identyfikator sesji.

Odnośne Flex błąd jest tutaj:

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

+2

Do tego, że pliki cookie sesji nie są wysyłane w Firefoksie, to fakt, że Flash Player używa stosu sieciowego systemu operacyjnego. Firefox ma własny stos sieciowy, więc Flash Player nie wie o tej sesji. Działa w IE, ponieważ IE również używa stosu systemu operacyjnego (oczywiście). – joshtynjala

0

Wygląda to dość stary, ale niedawno wpadł na ten problem, zbyt. Moja poprawka (która jest daleka od optymalnej) pod konfiguracją szyny uwierzytelnionej Flex + polegała na wyłączeniu uwierzytelniania sesji w skrypcie przesyłania.

Ponieważ naprawdę zrobił chcesz co najmniej podstawowe uwierzytelnianie, zapisałem nazwę użytkownika i hasło, które użytkownik zalogowany z i napisał kod, aby wysłać/potwierdzić, że ręcznie po stronie szyn. Nigdy nie udało mi się uruchomić "jsessionidowego" hacka, ponieważ flash nie ma dostępu do sesji przeglądarki.

Mam nadzieję, że pomoże to komuś zaoszczędzić trochę czasu.

0

To jest rzeczywisty flash player bug. Może ten link da ci kilka pomysłów.

Co masz na serwerze? Może mógłbyś dodać parametr sessionid jako parametr do twojej prośby.

1

Rozwiązałem ten problem. Przesyłanie plików za pomocą Flex działa we wszystkich przeglądarkach. W aplikacji J2ee,

skomentuj ograniczenie bezpieczeństwa lub spraw, aby adres URL pliku fileupload.do był niezabezpieczony w pliku web.xml, w którym wstawisz rzeczywisty kod.

<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> 

Mam nadzieję, że pomoże to następnemu czytelnikowi.

+0

lolz, czyli w jedną stronę. – Tom

1

FlashPlayer 10 oferuje nowy interfejs API Filereference, który może bardzo pomóc. Oto blog opisujący to: http://www.flexpasta.com/index.php/2010/02/21/uploading-files-with-firefox-solution/.

Rzeczywiście we Flash 10 rozszerzenie do pliku flash.net.FileReference umożliwia odczytanie zawartości pliku przed jego przesłaniem. Oznacza to, że plik można przesłać na różne sposoby, a następnie można to zrobić w programie Flash 9. Poniższy przykład pokazuje, jak łatwe może być przesyłanie plików i nie jest powiązany z protokołem SSL, Firefox, IE, Chrome itp.

1

Udało mi się obejść ten błąd za pomocą Flex i Java web Filter

Kod Flex: KOD

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

JAVA:

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() { 
    } 

} 
1

Zmierzyłem ten sam problem. Przesyłanie plików działało we wszystkich przeglądarkach oprócz firefox. W firefox został zgłoszony błąd # 2038 podczas przesyłania pliku. Aplikacja wykorzystała SSL .. W moim przypadku nawet żądanie przesyłania nie zostało wygenerowane z firefox, co mogłem potwierdzić, widząc w panelu Net firebug, adres URL przesyłania nie został trafiony. Oznacza to, że może być flashowym środowiskiem uruchomieniowym w firefox, który blokował wysyłanie żądania. Jednak, gdy uruchomiłem aplikację w IE, zainstalowałem samopodpisany certyfikat aplikacji w IE, przesyłanie plików w sposób ambiwalentny i oczywiście zdumiewająco, zacząłem pracować w firefox. Najpierw sprawdź, czy żądanie jest nawet docierane do serwera lub zablokowane u klienta.

Dzięki

0

Kilka razy nawet jeśli wyślemy cookies za pośrednictwem adresu URL nie będzie działać. Dzieje się tak dlatego, że Flex blokuje żądanie przesyłania plików.

Aby odblokować, należy zainstalować certyfikat SSL, a następnie spróbuj go.

Jeśli ktoś ma jakąkolwiek inną odpowiedź, proszę dać mi znać.

0

Od czasu, gdy budowałem aplikację Flash na Facebooku, nie miałem dostępu do jsessionid.

Rozwiązałem ten problem przez przesyłanie na adres HTTPS zamiast HTTP.

Jedną z rzeczy, która sprawiała mi kłopot, jest to, że w OSX Firefox i Safari (nie Chrome) typ (FileReferenceInstance) ma wartość null, a (FileReferenceInstance) .name pochodzi z pełnym rozszerzeniem (myimage.jpg).

Powiązane problemy