Как заставить загрузку файлов Flex работать в Firefox и Safari? - PullRequest
9 голосов
/ 09 декабря 2008

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

Ответы [ 10 ]

3 голосов
/ 26 марта 2009

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

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

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

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

//...

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

В моем случае я использую ColdFusion с включенными java-сессиями, поэтому мои 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";

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

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

3 голосов
/ 09 декабря 2008

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

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

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

Связанная ошибка Flex здесь:

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

1 голос
/ 01 ноября 2012

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

Спасибо

1 голос
/ 17 марта 2011

Мне удалось обойти эту ошибку с помощью веб-фильтра flex и 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:

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 голос
/ 04 августа 2010

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 голос
/ 29 мая 2010

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

закомментируйте ограничение безопасности или сделайте URL-адрес fileupload.do незащищенным в файле 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> 

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

0 голосов
/ 06 декабря 2013

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

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

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

0 голосов
/ 01 ноября 2012

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

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

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

0 голосов
/ 10 марта 2009

Это актуальная ошибка flash player . Может быть, эта ссылка даст вам некоторые идеи.

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

0 голосов
/ 10 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...