0

使用默认的 Cookie 会话存储时,有什么方法可以将文件从 flex 应用程序上传到 rails 2.2 后端?

4

1 回答 1

3

不,它不起作用的原因是 Flex 在使用 FileReference#upload 时不传输 cookie。一种解决方法(对于 Rails 2.3)是为 flash 请求插入一个自定义中间件处理程序,该处理程序接受查询字符串中的参数,并在到达 Rails 之前将它们添加到 HTTP_COOKIE 环境。

require 'rack/utils'

class FlashSessionCookieMiddleware
  def initialize(app, session_key = '_session_id')
   @app = app
   @session_key = session_key
  end

  def call(env)
    if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
      params = ::Rack::Utils.parse_query(env['QUERY_STRING'])
      env['HTTP_COOKIE'] = [ @session_key, params[@session_key] ].join('=').freeze unless params[@session_key].nil?
    end
    @app.call(env)
  end
end

确保文件在您的加载路径中并将其添加到您的 session_store.rb:

ActionController::Dispatcher.middleware.use FlashSessionCookieMiddleware, ActionController::Base.session_options[:key]

然后您需要将会话密钥输出到某处的视图并使用 Flex 内部的 ExternalInterface 加载它:

def upload_path_with_session_information
  session_key = ActionController::Base.session_options[:key]
  uploads_path(session_key => cookies[session_key], request_forgery_protection_token => form_authenticity_token)
end

如您所见,我有一个名为 uploads 的资源,我使用upload_path_with_session_information帮助程序给我一个不错的 URL,当从 FLEX 发布到该 URL 时,您可以为其他所有内容保留 cookie 存储。

老实说,我不记得我是在哪里在线找到这些信息的,但我不能把它归功于它。希望它对你有意义。

于 2009-07-02T23:35:47.490 回答