2008-12-08 21 views
9

Tôi có ứng dụng flex tải tệp lên máy chủ. Máy chủ yêu cầu xác thực để có thể tải lên. Trong IE, tải lên hoạt động tốt. Tuy nhiên trong FF và Safari, nó không tải lên. Tôi đã thấy mọi người trên cùng với vấn đề này nhưng không có câu trả lời. Đừng thất bại tôi bây giờ stackoverflowers.Làm cách nào để tạo tệp tải lên Flex trên firefox và safari?

+0

Tôi sẽ tự nghiên cứu vấn đề này trong vài tuần tới và tôi sẽ báo cáo lại về bất kỳ thành công hay thất bại nào mà tôi có. –

+0

Nếu không có thêm thông tin, câu hỏi này gần như không thể trả lời. Bạn đang sử dụng một thành phần được viết bởi người khác hoặc của riêng bạn? Tính năng xác thực có hoạt động trong tất cả các trình duyệt không? Bạn có đoạn mã? Bất kỳ ý tưởng nơi mã đang dừng/ném bom? –

Trả lời

3

Tôi đã tìm thấy câu hỏi này trong khi tự mình tìm câu trả lời. Giải pháp khá đơn giản.

Dựa trên số flash player bug mà những người khác đã liên kết và nhận xét trên trang đó, tôi quyết định nối thêm số nhận dạng phiên vào URL tải lên của tôi và cung cấp ảnh. Nó thực sự là dễ dàng!

Để làm cho nó hoạt động, tôi bắt đầu bằng cách thêm tham số flashVar được gọi là sessionParams. Điều này cho phép tôi chuyển bất kỳ chuỗi ký tự nào mà tôi muốn vào trình phát flash làm số nhận dạng phiên của mình và sau đó nó sẽ được nối vào URL được sử dụng để tải lên.

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

//... 

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

Trong trường hợp của tôi, tôi đang trên ColdFusion với phiên java kích hoạt, vì vậy sessionParams của tôi được thiết lập như sau trước khi được chuyển vào flash player:

<cfset flashVars = "sessionParams=#urlEncodedFormat('jsessionid=' & session.sessionid)#" /> 

Đừng quên để thoát các ký tự đặc biệt như =, &, v.v. (mà tôi đã thực hiện với urlEncodedFormat), để chúng được coi là một phần của giá trị của tham số "sessionParams" và không phải là điểm ngắt để biểu thị các tham số khác. Bạn đang nhúng thông tin URL trong tương lai vào URL hiện tại.

Sau đó, sử dụng giá trị sessionParams trong mã tải lên của bạn.Dưới đây là một đoạn trích về cách tôi thiết lập mỏ của tôi:

// Set Up URLRequest 
_uploadURL = new URLRequest; 
_uploadURL.url = _url + "?" + _sessionParams; 
_uploadURL.method = "GET"; 
_uploadURL.data = _variables; 
_uploadURL.contentType = "multipart/form-data"; 

Tên biến khác nhau (nhưng tương tự) vì đây là một phần của lớp có thể sử dụng lại.

Hy vọng điều đó sẽ giúp ích cho bạn. Nếu không, hãy cho tôi biết và tôi sẽ cố gắng cung cấp thêm mã hoặc giải thích để giúp bạn.

+0

Thật không may tôi đang sử dụng .net. Tuy nhiên, tôi đang sử dụng một phương pháp tương tự như tôi đã tìm thấy trong câu hỏi này http://stackoverflow.com/questions/43324/can-i-put-an-asp-net-session-id-in-a-hidden-form-field – smartdirt

+1

Thật không may, điều này không hoạt động nếu cookie JSESSIONID của bạn được đặt thành httponly, đây là cấu hình được đề xuất cho các cấu hình bảo mật (để ngăn XSS). –

+0

Chưa kể, việc gửi ID phiên trong URL cho thấy các phiên trung gian (ví dụ: cache) hoặc những người khác (ví dụ: thông qua nhật ký yêu cầu, theo dõi, phân tích). –

3

Vấn đề ít nhất trong Firefox là cookie phiên không được gửi trong yêu cầu khi bạn gọi FileReference.upload(). Những gì bạn cần làm là thêm mã xác thực hoặc dưới dạng biến biểu mẫu hoặc trong chuỗi truy vấn. Dưới đây là một ví dụ trong Java nơi cookie phiên được gọi là "jsessionid"

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

Bạn có thể phân tích các jsessionid ra cookie sử dụng Javascript và ExternalInterface để gọi chức năng Javascript. Hoặc sau khi bạn xác thực bạn có thể có Flex gọi một phương thức phụ trợ trả về sessionID hiện tại.

Các Flex lỗi liên quan là ở đây:

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

+2

Để thêm vào điều này, lý do cookie phiên không được gửi trong Firefox là do Flash Player sử dụng ngăn xếp mạng của hệ điều hành. Firefox có ngăn xếp mạng riêng, do đó Flash Player không biết về phiên. Nó hoạt động trong IE vì IE cũng sử dụng chồng hệ điều hành (rõ ràng). – joshtynjala

0

Hình như đây là khá cũ, nhưng gần đây tôi chạy vào vấn đề này, quá. Sửa chữa của tôi (mà là xa tối ưu) dưới một thiết lập đường ray Flex + xác thực là tắt xác thực dựa trên phiên trên kịch bản tải lên.

Kể từ khi tôi thực sự đã muốn tại xác thực cơ bản nhất, tôi lưu trữ tên người dùng và mật khẩu mà người dùng đăng nhập, và viết mã để gửi/xác nhận rằng bằng tay ở phía bên đường ray. Tôi không bao giờ có thể hack "jsessionid" hoạt động, vì flash không có quyền truy cập vào các phiên trình duyệt.

Tôi hy vọng điều này sẽ giúp ai đó tiết kiệm một chút thời gian.

0

Đây là số thực tế flash player bug. Có lẽ liên kết này sẽ cung cấp cho bạn một số ý tưởng.

Bạn có gì ở phía máy chủ? Có thể bạn có thể thêm sessionid làm thông số trong yêu cầu của mình.

1

Tôi đã giải quyết được sự cố này. Tải lên tệp bằng cách sử dụng flex sẽ hoạt động trên tất cả các trình duyệt.Ứng dụng J2ee,

nhận xét ràng buộc bảo mật hoặc làm cho tệp tinupload.do URL không được bảo vệ trong tệp web.xml nơi bạn sẽ đặt mã thực.

<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> 

Hy vọng điều này sẽ giúp người đọc tiếp theo.

+0

lolz, đó là một cách. – Tom

1

FlashPlayer 10 cung cấp API tập trung mới có thể giúp ích rất nhiều. Đây là một mục blog mô tả nó: http://www.flexpasta.com/index.php/2010/02/21/uploading-files-with-firefox-solution/.

Thực tế trong Flash 10 một sự nâng cao lên flash.net.FileReference giúp bạn có thể đọc nội dung của tệp trước khi tệp được tải lên. Có nghĩa là tệp có thể được tải lên theo nhiều cách khác nhau sau đó có thể được thực hiện trong Flash 9. Ví dụ sau cho thấy việc tải lên tệp có thể dễ dàng như thế nào và không liên quan đến SSL, Firefox, IE, Chrome, v.v.

1

tôi đã quản lý làm việc xung quanh lỗi này sử dụng bộ lọc web flex và java

Mã 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 Mã sản phẩm:

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

Tôi gặp vấn đề tương tự .. Tải lên tệp đang hoạt động trên tất cả các trình duyệt ngoại trừ firefox. Trong firefox, lỗi # 2038 đã bị ném trong khi tải lên tệp. Ứng dụng được sử dụng SSL .. Trong trường hợp của tôi, ngay cả yêu cầu tải lên không được tạo từ firefox mà tôi có thể xác nhận bằng cách nhìn thấy trong bảng điều khiển Net của firebug, URL tải lên không bị ảnh hưởng. Điều đó có nghĩa, có thể là thời gian chạy flash trong firefox đã chặn yêu cầu tải lên. Tuy nhiên, khi tôi chạy ứng dụng trong IE, cài đặt chứng chỉ tự ký của ứng dụng trong IE, tệp tải lên mơ hồ và ofcourse đáng kinh ngạc, bắt đầu làm việc trong firefox .. Vì vậy trước tiên hãy kiểm tra xem yêu cầu có được tiếp cận với máy chủ hay không bị chặn tại máy khách.

Cảm ơn

0

Một số lần ngay cả khi chúng tôi gửi cookie qua URL, URL này sẽ không hoạt động. Điều này là do Flex đang chặn yêu cầu tải lên tệp.

Để bỏ chặn, bạn phải cài đặt chứng chỉ SSL và sau đó thử.

Nếu có ai có bất kỳ câu trả lời nào khác, vui lòng cho tôi biết.

0

Vì tôi đang xây dựng một ứng dụng Flash cho Facebook, tôi không có quyền truy cập vào jsessionid.

Tôi đã giải quyết sự cố này bằng cách tải lên địa chỉ HTTPS thay vì HTTP.

Một điều khiến tôi gặp rắc rối là trong OSX Firefox và Safari (không phải Chrome), (FileReferenceInstance) .type là null, và (FileReferenceInstance) .name đi kèm với phần mở rộng đầy đủ (myimage.jpg).

Các vấn đề liên quan