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





Проблема, по крайней мере в 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 также использует стек ОС (очевидно).
Похоже, он довольно старый, но недавно я тоже столкнулся с этой проблемой. Мое исправление (которое далеко не оптимально) при настройке рельсов с аутентификацией 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/…
К сожалению, это не работает, если ваш файл cookie JSESSIONID установлен на httponly, что является рекомендуемой конфигурацией для защиты (для предотвращения XSS).
Не говоря уже о том, что отправка идентификаторов сеансов в URL-адресе открывает сеанс посредникам (например, кешам) или другим людям (например, через журналы запросов, мониторинг, аналитику).
Я решил эту проблему. Загрузка файла с помощью 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).
В ближайшие недели я буду работать над решением этой проблемы и сообщать обо всех своих успехах или неудачах.