Как заставить загрузку файла Flex работать в firefox и safari?

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

В ближайшие недели я буду работать над решением этой проблемы и сообщать обо всех своих успехах или неудачах.

Adam Tuttle 25.03.2009 23:03

Без дополнительной информации на этот вопрос почти невозможно ответить. Используете ли вы компонент, написанный кем-то другим, или ваш собственный? Работает ли аутентификация во всех браузерах? У вас есть фрагмент кода? Есть идеи, где код останавливается / взрывается?

Paul Morel 09.12.2008 03:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
2
15 890
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

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

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

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

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

В дополнение к этому причина того, что файлы cookie сеанса не отправляются в Firefox, заключается в том, что Flash Player использует сетевой стек операционной системы. Firefox имеет собственный сетевой стек, поэтому Flash Player не знает о сеансе. Это работает в IE, потому что IE также использует стек ОС (очевидно).

Josh Tynjala 12.12.2008 01:48

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

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

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

Это настоящий ошибка флеш-плеера. Возможно, эта ссылка даст вам некоторые идеи.

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

Ответ принят как подходящий

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

Основываясь на ошибка флеш-плеера, на который ссылаются другие, и на комментариях на этой странице, я решил добавить идентификаторы сеанса к моему 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";

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

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

К сожалению, я использую .net. Однако я использую аналогичный метод, который нашел в этом вопросе stackoverflow.com/questions/43324/…

smartdirt 20.04.2009 19:07

К сожалению, это не работает, если ваш файл cookie JSESSIONID установлен на httponly, что является рекомендуемой конфигурацией для защиты (для предотвращения XSS).

Rafal Rusin 09.02.2013 09:33

Не говоря уже о том, что отправка идентификаторов сеансов в URL-адресе открывает сеанс посредникам (например, кешам) или другим людям (например, через журналы запросов, мониторинг, аналитику).

William Price 10.03.2018 02:51

Я решил эту проблему. Загрузка файла с помощью 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> 

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

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 и т. д.

мне удалось обойти эту ошибку, используя гибкий и 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() {
    }

}

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

Спасибо

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

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

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

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

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

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

Другие вопросы по теме