6

私が達成しようとしているのは、URLLoaderクラスをURLRequestと共に使用して、バイナリデータ、特にPNGイメージを表すByteArrayをサーバーにアップロードすることです。URLLoaderを使用すると予期しないFlashセキュリティ例外

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); 
}); 

答えて

13

contentTypeはあなたが送るどのデータを参照しませんが、どのようなデータにあなたが受け取ることは可能である可能性があります。 requestHeadersを設定しようと、それが動作するはずです:

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

はまた、私はどこに私のプロジェクトの一つにコードの一部を発見しました。コードは動作し、POSTを使用していくつかのバイナリJPEGデータをサーバーに送信します。私はしばらく前にそれをやったので、なぜこのようにしたのか説明できませんが、おそらく助けになるかもしれません。であるように私はそれを貼り付けています:、

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())); 

キー:

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); 
} 
+1

ありがとうございました!私は昨晩何時間も困惑していた... 私はいくつかのものを微調整しなければならなかったので、私の答えが正確にどのように働いていたのかを見てください。 – Cameron

+0

あなたは大歓迎です。ええ、境界について知っておいてよかったです。よろしく。 – evilpenguin

+0

soooたくさんありがとう...私はめったにフラッシュデベロッパーはしませんが、アップローダをアップデートする必要がありました。 – will

8

ただ、完全性ために、ここで私は私のURLRequestオブジェクトを(他のすべてが同じ滞在)の設定終わった方法ですevilpenguinによって指摘されているように、contentTypeプロパティを設定するのではなく、ヘッダーに入れることでした。しかし、 'multipart/form-data'だけを使用すると、無効なPOST境​​界についてサーバー側でエラーが発生したため、a class called UploadPostHelperを使用してファイルアップロードの有効な境界とPOSTボディを作成しました。

これは不思議なセキュリティエラー(私はまだそれがなぜ起こったのか分かりません)を修正し、アップロードを待つ時間が非常に長くなりました。

UploadPostHelperを使用するサンプルコードでは、URLRequestオブジェクトのcontentTypeプロパティを設定する必要があります。これは一部の人には当てはまりますが、私の場合はそうではありません。

4

私は同じ問題がありました。 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); 
関連する問題