我有一个将文件上传到服务器的灵活应用。服务器要求身份验证才能上载。在IE中,上传工作正常。但是在FF和Safari中,它不会上传。我已经看到各地的人都遇到同样的问题,但没有答案。不要让我失败现在stackoverflowers。
答案 0 :(得分:3)
至少在Firefox中的问题是,当您调用FileReference.upload()时,会话cookie不会在请求中发送。您需要做的是将身份验证令牌添加为表单变量或查询字符串。以下是Java中的一个示例,其中会话cookie称为“jsessionid”
var request : URLRequset = new URLRequest( uploadUrl + ";jsessionid=" + jsessionid);
您可以使用Javascript和ExternalInterface从cookie中解析jsessionid来调用Javascript函数。或者在进行身份验证后,您可以让Flex调用后端方法,该方法返回当前的sessionID。
相关的Flex错误在这里:
答案 1 :(得分:3)
我在试图找到答案时发现了这个问题。解决方案相当简单。
根据其他人已关联的flash player bug以及该页面上的评论,我决定将会话标识符附加到我的上传网址并为其提供一个镜头。真的很容易!
为了使它工作,我开始添加一个名为sessionParams的flashVar参数。这允许我将我想要的任何字符串作为我的会话标识符传递给flash播放器,稍后它将附加到用于上传的URL。
//sessionParams - resolves firefox upload bug
public var sessionParams:String = "";
//...
public function initApp():void{
sessionParams = Application.application.parameters.sessionParams;
}
在我的情况下,我在启用了Java会话的ColdFusion上,所以我的sessionParams
在被传递到flash播放器之前的设置如下:
<cfset flashVars = "sessionParams=#urlEncodedFormat('jsessionid=' & session.sessionid)#" />
不要忘记转义特殊字符,例如=,&amp;等等(我用urlEncodedFormat完成),这样它们就被视为“sessionParams”参数值的一部分,而不是断点来表示其他参数。您正在将未来网址信息嵌入当前网址。
然后,在您的上传代码中使用sessionParams值。以下是我如何设置自己的片段:
// Set Up URLRequest
_uploadURL = new URLRequest;
_uploadURL.url = _url + "?" + _sessionParams;
_uploadURL.method = "GET";
_uploadURL.data = _variables;
_uploadURL.contentType = "multipart/form-data";
变量名称不同(但相似),因为它是可重用类的一部分。
希望能帮到你。如果没有,请告诉我,我会尝试提供更多代码或解释来帮助您。
答案 2 :(得分:1)
我解决了这个问题。使用flex进行文件上传将适用于所有浏览器。在J2ee应用程序中,
注释security-constraint或使fileupload.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>
希望这会有助于下一位读者。
答案 3 :(得分:1)
FlashPlayer 10提供了一个新的Filereference API,它可以提供很多帮助。 以下是描述它的博客条目: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等无关。
答案 4 :(得分:1)
我设法使用flex和java web过滤器解决这个bug
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() {
}
}
答案 5 :(得分:1)
我遇到了同样的问题..文件上传工作在除Firefox之外的所有浏览器上。在firefox中,上传文件时出现错误#2038。该应用程序使用SSL .. 在我的情况下,即使上传请求不是从firefox生成的,我可以通过在firebug的Net面板中查看来确认,上传的URL没有被点击。这意味着,可能是firefox中的flash运行时阻止了上传请求。 但是,当我在IE中运行应用程序时,在IE中安装了应用程序的自签名证书,文件上传模糊不清,并且开始在firefox中工作。 因此,首先请检查是否已将请求发送到服务器或在客户端被阻止。
由于
答案 6 :(得分:0)
看起来这已经很老了,但我最近也遇到了这个问题。在Flex +认证的rails设置下,我的修复(远非最佳)是关闭上传脚本中基于会话的身份验证。
由于我确实至少需要基本身份验证,因此我存储了用户登录的用户名和密码,并编写了代码以便在rails端手动发送/验证。我永远无法让“jsessionid”黑客工作,因为Flash无法访问浏览器会话。
我希望这可以帮助别人节省一些时间。
答案 7 :(得分:0)
这是一个实际的flash player bug。也许这个链接会给你一些想法。
你在服务器端有什么?也许你可以在你的请求中添加sessionid作为参数。
答案 8 :(得分:0)
有时候,即使我们通过网址发送Cookie也无法使用。这是因为Flex阻止了文件上传请求。
要取消阻止,您必须安装SSL证书,然后尝试。
如果有人有任何其他答案,请告诉我。
答案 9 :(得分:0)
由于我正在为Facebook构建Flash应用程序,因此无法访问jsessionid。
我通过上传到HTTPS地址而不是HTTP 解决了这个问题。
导致我麻烦的一件事是在OSX Firefox和Safari(不是Chrome)中,(FileReferenceInstance).type为null,而(FileReferenceInstance).name附带完整扩展名(myimage.jpg)。