2008-12-08 4 views
9

У меня есть приложение flex, которое загружает файлы на сервер. Сервер требует аутентификации для загрузки. В IE загрузка работает нормально. Однако в FF и Safari он не загружается. Я видел людей со всей этой проблемой, но ответов нет. Не подведи меня теперь stackoverflowers.Как сделать загрузку файлов Flex в firefox и safari?

+0

Я буду работать над тем, чтобы обойти эту проблему в ближайшие недели, и я расскажу о любых успехах или неудачах, которые у меня есть. – 2009-03-25 20:03:04

+0

Без дополнительной информации на этот вопрос почти невозможно ответить. Вы используете компонент, написанный кем-то другим или своим? Работает ли аутентификация во всех браузерах? У вас есть фрагмент кода? Любая идея, где код останавливается/бомбардируется? – 2008-12-09 00:52:28

ответ

3

Я нашел этот вопрос, пытаясь найти ответ сам. Решение было довольно простым.

На основании flash player bug, с которым были связаны другие пользователи, и комментарии на этой странице, я решил добавить идентификаторы сеанса к URL-адресу для загрузки и сделать снимок. Это было так просто!

Чтобы заставить его работать, я начал с добавления параметра flashVar, называемого sessionParams. Это позволило мне передать любую строку, в которую я хочу включить флеш-плеер, в качестве идентификатора сеанса, и позже он будет добавлен к URL-адресу, используемому для загрузки.

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

//... 

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

В моем случае, я на ColdFusion с ява сессий с поддержкой, так что мой sessionParams настроены как следующее перед передачей в флэш-плеер:

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

Имена переменных различны (но подобное), так как это является частью многоразовой класса.

Надеюсь, это поможет вам. Если нет, сообщите мне, и я постараюсь предоставить больше кода или объяснений, чтобы помочь вам.

+0

К сожалению, я использую .net. Тем не менее, я использую аналогичный метод, который я нашел в этом вопросе http://stackoverflow.com/questions/43324/can-i-put-an-asp-net-session-id-in-a-hidden-form-field – smartdirt 2009-04-20 15:07:20

3

Проблема, по крайней мере, в Firefox заключается в том, что cookie сеанса не отправляется в запросе при вызове FileReference.upload(). Что вам нужно сделать, это добавить токен аутентификации либо как переменную формы, либо в строку запроса. Вот пример, в Java, где куки сессии называется «JSESSIONID»

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

Вы можете разобрать JSESSIONID из печенья с использованием Javascript и ExternalInterface, чтобы вызвать функцию JavaScript. Или после проверки подлинности вы можете вызвать метод Flex, который возвращает текущий идентификатор сессии.

Родственный Flex ошибка здесь:

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

+2

Чтобы добавить к этому, причина, по которой cookie сеанса не отправляется в Firefox, заключается в том, что Flash Player использует сетевой стек операционной системы. У Firefox есть собственный сетевой стек, поэтому Flash Player не знает о сеансе. Он работает в IE, потому что IE также использует стек ОС (очевидно). – joshtynjala 2008-12-11 22:48:31

0

Похоже, это довольно старая, но я недавно столкнулся с этой проблемой тоже. Мое исправление (далекое от оптимального) в соответствии с настройкой рельсов Flex + с проверкой подлинности состояло в том, чтобы отключить проверку подлинности на основе сеанса в сценарии загрузки.

Поскольку я действительно сделал хочу хотя бы базовую аутентификацию, я записал имя пользователя и пароль, с которыми вошел пользователь, и написал код для отправки/проверки этого вручную на стороне рельсов. Я никогда не смог заставить «jsessionid» взломать работу, поскольку флеш не имеет доступа к сеансам браузера.

Надеюсь, это поможет кому-то сэкономить немного времени.

0

Это фактический flash player bug. Возможно, эта ссылка даст вам некоторые идеи.

Что у вас на стороне сервера? Возможно, вы можете добавить sessionid в качестве параметра в свой запрос.

1

Я решил эту проблему. Загрузка файлов с использованием flex будет работать на всех браузерах. В приложении J2ee

комментировать ограничение безопасности или сделать файлupload.do URL незащищенным в web.xml, где вы поместите фактический код.

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

Надеюсь, это поможет читателю.

1

FlashPlayer 10 предоставляет новый API Filereference, который может помочь многим. Это запись в блоге, которая описывает это: 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 и т. Д.

1

Мне удалось обойти эту ошибку с помощью гибкого и Java веб-фильтр

Flex Код:

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

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

Я столкнулся с той же проблемой. Загрузка файла работала на всех браузерах, кроме firefox. В firefox при загрузке файла была выбрана ошибка # 2038. Приложение использовало SSL .. В моем случае даже запрос на загрузку не генерировался из firefox, который я мог подтвердить, увидев панель Netbash Firebug, URL-адрес загрузки не был удален. Это означает, что flash-время в firefox блокирует запрос на загрузку. Однако, когда я запустил приложение в IE, установил самозаверяющий сертификат приложения в IE, загрузился файл неоднозначно и конечно, начал работать в firefox .. Итак, сначала проверьте, даже ли запрос достигнут на сервере или заблокирован клиентом.

Благодаря

0

Несколько раз, даже если мы посылаем куки через URL не будет работать. Это связано с тем, что Flex блокирует запрос на загрузку файла.

Чтобы разблокировать его, вам необходимо установить сертификат SSL, а затем попробовать его.

Если у кого-либо есть другой ответ, пожалуйста, дайте мне знать.

0

Поскольку я создавал Flash-приложение для Facebook, у меня не было доступа к jsessionid.

Я решил эту проблему: Загрузка на HTTPS-адрес вместо HTTP.

Одна вещь, которая вызвала у меня проблемы, заключается в том, что в OSX Firefox и Safari (а не в Chrome) тип файла (FileReferenceInstance) равен null, а имя (FileReferenceInstance) содержит полное расширение (myimage.jpg).

Смежные вопросы