【问题标题】:Unexpected Flash Security Exception When Using URLLoader使用 URLLoader 时出现意外的 Flash 安全异常
【发布时间】:2009-08-13 06:28:05
【问题描述】:

我想要完成的是使用 URLLoader 类和 URLRequest 将一些二进制数据,特别是表示 PNG 图像的 ByteArray 上传到服务器。

当我将 URLRequest 的 contentType 属性设置为“multipart/form-data”而不是默认值时,对 urlLoader.load() 的调用会导致安全异常。

当我将 contentType 属性保留为默认值时,它可以正常工作,但需要很长时间(与 PNG 文件的长度成正比)才能将文件上传到服务器。

那么,我的问题是为什么我会收到此安全异常?又该如何避免呢?

请注意,我的 SWF 是从开发服务器而不是本地文件系统(准确地说是 Google App Engine 开发服务器)提供的。

代码如下:

var pngFile:ByteArray = PNGEncoder.encode(bitmapData);

var urlRequest:URLRequest = new URLRequest('/API/uploadImage');

// With this line of code, the call to urlLoader.load() throws the following security exception:
// 'SecurityError: Error #2176: Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press.'
urlRequest.contentType = 'multipart/form-data';

urlRequest.method = URLRequestMethod.POST;
urlRequest.data = pngFile;
urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));

urlLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.addEventListener(Event.COMPLETE, onUploadComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onUploadError);

NextFrame.addCallback(function () {
    urlLoader.load(urlRequest);
});

【问题讨论】:

    标签: actionscript-3 file-upload securityexception urlrequest urlloader


    【解决方案1】:

    contentType 可能不是指您发送的数据,而是指您接收的数据。尝试设置requestHeaders,应该可以:

    urlRequest.requestHeaders.push(new URLRequestHeader('Content-type', 'multipart/form-data'));
    

    另外,我在我的一个项目中发现了一段代码。该代码工作并使用 POST 将一些二进制 JPEG 数据发送到服务器。我前段时间做过,我无法解释为什么我会这样做,但也许它会有所帮助。我按原样粘贴:

    function sendData(submitPath:String, descriere:String):void {
        // building the url request for uploading the jpeg to the server
        var header:URLRequestHeader = new URLRequestHeader('Content-type', 'application/octet-stream');
        var jpgURLRequest:URLRequest = new URLRequest(submitPath+'/id/'+player.id+'/path/'+player.contentPath.replace('/','')+'/width/'+player.videoWidth+'/height/'+player.videoHeight+'/descriere/'+descriere+'/timp/'+time);
        jpgURLRequest.requestHeaders.push(header);
        jpgURLRequest.method = URLRequestMethod.POST;
        jpgURLRequest.data = screenShot;
    
        // sending the data to the server
        var sender:URLLoader = new URLLoader();
        sender.load(jpgURLRequest);
    }
    

    【讨论】:

    • 非常感谢!昨晚我被难住了好几个小时......我不得不调整一些东西,所以看看我的答案到底是如何工作的
    • 不客气。是的,很高兴知道边界。问候。
    • 非常感谢...我很少做 Flash 开发,但我需要更新一个上传器,这终于救了我 :)
    【解决方案2】:

    为了完整起见,这就是我最终设置 URLRequest 对象的方式(其他一切都保持不变):

    urlRequest.method = URLRequestMethod.POST;
    urlRequest.data = UploadPostHelper.getPostData('filename', pngFile);
    urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));
    urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary()));
    

    正如 evilpenguin 所指出的,关键是根本不设置 contentType 属性,而是将其放在标题中。但是,仅使用“multipart/form-data”时,我在服务器端收到有关无效 POST 边界的错误,因此我最终使用a class called UploadPostHelper 为文件上传创建有效边界和 POST 正文。

    这修复了神秘的安全错误(我仍然不知道为什么会这样),以及等待上传的时间。

    需要注意的是,使用 UploadPostHelper 的示例代码涉及设置 URLRequest 对象的contentType 属性,这显然适用于某些人,但不适用于我的情况。

    【讨论】:

      【解决方案3】:

      我有同样的问题。提交到 PHP 脚本时它工作正常,但不是 ASP 脚本。将内容类型移动到 requestHeader 后,它可以正常工作。这是我的代码:

      // Object containing form fields
      var formdata = new Object();
      formdata.Email = textArray[8].text;
      
      //URLRequest containing the form fields and the attached image
      var urlRequest : URLRequest = new URLRequest(url);
      urlRequest.method = URLRequestMethod.POST;
      urlRequest.data = UploadPostHelper.getPostData( imageName, imageByteArray, formdata );
      urlRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );
      urlRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'multipart/form-data; boundary=' + UploadPostHelper.getBoundary())); 
      
      //URLLoader to load the request
      var urlLoader : URLLoader = new URLLoader();
      urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
      urlLoader.load( urlRequest );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2011-04-01
        • 1970-01-01
        • 2019-12-10
        • 2018-12-06
        相关资源
        最近更新 更多