[Flash] 在 Flash 中 load 來自 http://profile.ak.fbcdn.net/ 的使用者圖片會報 checkPolicyFile 錯誤的解法

Standard

在製作放置於外部的 Flash Game 時,有利用到 Facebook Graph API 去撈使用者的顯示圖片(https://graph.facebook.com/使用者UID/picture,會回傳位於 http://profile.ak.fbcdn.net/ 的圖片網址),但由於 Flash 中的安全性設置,若有裝 Flash Player Debug 版,就會跳出這樣的錯誤訊息

需要指定原則檔,但是在載入媒體時,尚未指定 checkPolicyFile 指標。

Google 了一下,找到了這篇 Blog,依照其中的 code:

Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
context.applicationDomain = ApplicationDomain.currentDomain;

依照這樣做的話就可避免引發錯誤了 :P

==

2010/11/16 更新:

但若無法正確對應,其實是會傳回位於 http://b.ak.fbcdn.net/http://static.ak.fbcdn.net/ 的預設人影圖的,這一樣有 crossdomain.xml,但載入後似乎沒有解決問題,所以,我們可以採用另一種方法,透過同網域的伺服器端程式處理,這樣就一定會是同網域。
以 ASP.NET 為例,可以開一個 ashx 檔,然後在 ProcessRequest 中這樣寫:

context.Response.ContentType = "image/Jpeg"
Dim durl As String = Common.Fn.GetRequestQueryString("durl")

Dim width, height As Integer

Dim wc As WebClient = New WebClient()
'Dim ms As MemoryStream = New MemoryStream(wc.DownloadData(durl))

'20110330修正: 直接輸出即可
context.Response.BinaryWrite(wc.DownloadData(durl))


'Dim image As System.Drawing.Image = New Drawing.Bitmap(ms)

'width = image.Width
'height = image.Height

'Dim img As System.Drawing.Bitmap = New System.Drawing.Bitmap(50, 50)
'Dim graphic As Drawing.Graphics = Drawing.Graphics.FromImage(img)
'graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
'graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
'graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
'graphic.DrawImage(image, 0, 0, 50, 50)

'image.Dispose()

'Dim ms_r As New System.IO.MemoryStream()
'img.Save(ms_r, System.Drawing.Imaging.ImageFormat.Jpeg)
'context.Response.ClearContent()
'context.Response.BinaryWrite(ms_r.ToArray())

'img.Dispose()
'graphic.Dispose()

然後在 Flash 中就可以醬子呼叫:
http://你的網址/上面範例.ashx?durl=http://graph.facebook.com/使用者ID/picture

感謝網友 aladdin 的回覆指正。

2 thoughts on “[Flash] 在 Flash 中 load 來自 http://profile.ak.fbcdn.net/ 的使用者圖片會報 checkPolicyFile 錯誤的解法

  1. 不需要再做一個drawImage的動作,直接把你收到的ResponseStream原原本本的丟往前端即可。

    Dim wc As WebClient = New WebClient()
    context.Response.BinaryWrite(wc.DownloadData(durl))

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *