У меня есть приложение flex, которое загружает файлы на сервер. Сервер требует аутентификации для загрузки. В IE загрузка работает нормально. Однако в FF и Safari он не загружается. Я видел людей со всей этой проблемой, но ответов нет. Не подведи меня теперь stackoverflowers.Как сделать загрузку файлов Flex в firefox и safari?
ответ
Я нашел этот вопрос, пытаясь найти ответ сам. Решение было довольно простым.
На основании 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";
Имена переменных различны (но подобное), так как это является частью многоразовой класса.
Надеюсь, это поможет вам. Если нет, сообщите мне, и я постараюсь предоставить больше кода или объяснений, чтобы помочь вам.
К сожалению, я использую .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
Проблема, по крайней мере, в Firefox заключается в том, что cookie сеанса не отправляется в запросе при вызове FileReference.upload(). Что вам нужно сделать, это добавить токен аутентификации либо как переменную формы, либо в строку запроса. Вот пример, в Java, где куки сессии называется «JSESSIONID»
var request : URLRequset = new URLRequest(uploadUrl + ";jsessionid=" + jsessionid);
Вы можете разобрать JSESSIONID из печенья с использованием Javascript и ExternalInterface, чтобы вызвать функцию JavaScript. Или после проверки подлинности вы можете вызвать метод Flex, который возвращает текущий идентификатор сессии.
Родственный Flex ошибка здесь:
Чтобы добавить к этому, причина, по которой cookie сеанса не отправляется в Firefox, заключается в том, что Flash Player использует сетевой стек операционной системы. У Firefox есть собственный сетевой стек, поэтому Flash Player не знает о сеансе. Он работает в IE, потому что IE также использует стек ОС (очевидно). – joshtynjala 2008-12-11 22:48:31
Похоже, это довольно старая, но я недавно столкнулся с этой проблемой тоже. Мое исправление (далекое от оптимального) в соответствии с настройкой рельсов Flex + с проверкой подлинности состояло в том, чтобы отключить проверку подлинности на основе сеанса в сценарии загрузки.
Поскольку я действительно сделал хочу хотя бы базовую аутентификацию, я записал имя пользователя и пароль, с которыми вошел пользователь, и написал код для отправки/проверки этого вручную на стороне рельсов. Я никогда не смог заставить «jsessionid» взломать работу, поскольку флеш не имеет доступа к сеансам браузера.
Надеюсь, это поможет кому-то сэкономить немного времени.
Это фактический flash player bug. Возможно, эта ссылка даст вам некоторые идеи.
Что у вас на стороне сервера? Возможно, вы можете добавить sessionid в качестве параметра в свой запрос.
Я решил эту проблему. Загрузка файлов с использованием 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>
Надеюсь, это поможет читателю.
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 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() {
}
}
Я столкнулся с той же проблемой. Загрузка файла работала на всех браузерах, кроме firefox. В firefox при загрузке файла была выбрана ошибка # 2038. Приложение использовало SSL .. В моем случае даже запрос на загрузку не генерировался из firefox, который я мог подтвердить, увидев панель Netbash Firebug, URL-адрес загрузки не был удален. Это означает, что flash-время в firefox блокирует запрос на загрузку. Однако, когда я запустил приложение в IE, установил самозаверяющий сертификат приложения в IE, загрузился файл неоднозначно и конечно, начал работать в firefox .. Итак, сначала проверьте, даже ли запрос достигнут на сервере или заблокирован клиентом.
Благодаря
Несколько раз, даже если мы посылаем куки через URL не будет работать. Это связано с тем, что Flex блокирует запрос на загрузку файла.
Чтобы разблокировать его, вам необходимо установить сертификат SSL, а затем попробовать его.
Если у кого-либо есть другой ответ, пожалуйста, дайте мне знать.
Поскольку я создавал Flash-приложение для Facebook, у меня не было доступа к jsessionid.
Я решил эту проблему: Загрузка на HTTPS-адрес вместо HTTP.
Одна вещь, которая вызвала у меня проблемы, заключается в том, что в OSX Firefox и Safari (а не в Chrome) тип файла (FileReferenceInstance) равен null, а имя (FileReferenceInstance) содержит полное расширение (myimage.jpg).
- 1. Как сделать загрузку нескольких файлов?
- 2. Сделать окно диспетчера загрузки файлов передним окном в Firefox/Safari
- 3. Chrome, отображающий загрузку gif по-другому, чем Safari и Firefox
- 4. Как сделать загрузку файлов в asp.net mvc?
- 5. setUninstallURL - в Safari и Firefox?
- 6. Stickyfill не работает в Safari и Firefox
- 7. Как сделать красивую и простую загрузку файлов в javascript?
- 8. Дисплей: flex не работает в firefox или safari
- 9. javascript как сделать загрузку как текстовую работу в firefox 3.6
- 10. Flexbox, Flex Wrap и Safari
- 11. Как сделать загрузку изображения гладкой в сафари и Chrome
- 12. Как сделать собственную загрузку файлов с помощью HTML и JavaScript
- 13. Как сделать флеш-загрузку в Chrome?
- 14. Как сделать flexbox для поддержки IE10 и Safari?
- 15. Добавить загрузку в Firefox через расширение Firefox
- 16. Flex - как создать загрузку в стиле лайтбокса?
- 17. Firefox flex и max-width
- 18. Проблемы с совместимостью css3 flexbox с Firefox и Safari
- 19. Как защитить загрузку файлов?
- 20. Positioning Different в Safari и Firefox
- 21. Как сделать загрузку файлов на основе форм в CakePHP?
- 22. Как обрабатывать загрузку файлов?
- 23. Silverlight в Safari и Firefox по умолчанию?
- 24. Как сделать загрузку файлов вместо открытия в браузере?
- 25. CSS в Safari/Firefox и Chrome
- 26. Проблемы с Ajax в Safari и Firefox
- 27. Flex box не работает в Safari 5.1
- 28. recaptcha не отображается в firefox и safari
- 29. Как нормализовать ошибки кросс-браузерного Flexbox в Firefox и Safari
- 30. Как сделать загрузку страницы быстрее?
Я буду работать над тем, чтобы обойти эту проблему в ближайшие недели, и я расскажу о любых успехах или неудачах, которые у меня есть. – 2009-03-25 20:03:04
Без дополнительной информации на этот вопрос почти невозможно ответить. Вы используете компонент, написанный кем-то другим или своим? Работает ли аутентификация во всех браузерах? У вас есть фрагмент кода? Любая идея, где код останавливается/бомбардируется? – 2008-12-09 00:52:28