跳至主要內容

在網頁上顯示圖片

網頁支援標準的 Image 小工具和更進階的 dart:ui/Image 類別(在需要更精細的控制來顯示圖片時)。但是,由於網頁瀏覽器的設計目的是安全地執行不受信任的程式碼,因此與行動和桌面平台相比,您在圖片方面可以執行的操作存在某些限制。此頁面說明了這些限制,並提供了解決這些限制的方法。

背景

#

網頁提供了幾種顯示圖片的方法

每個選項都有其自身的優點和缺點。例如,內建元素可以很好地融入其他 HTML 元素中,並且它們會自動利用瀏覽器的快取、內建圖片優化和記憶體管理。它們允許您安全地顯示來自任意來源的圖片(更多內容請參閱下方的 CORS 章節)。當圖片必須符合使用 <canvas> 元素呈現的其他內容時,drawImage 非常適合。您還可以控制圖片大小,並且在 CORS 政策允許的情況下,讀取圖片的像素以進行進一步處理。最後,WebGL 讓您對圖片擁有最高的控制權。您不僅可以讀取像素並套用自訂圖片演算法,還可以使用 GLSL 進行硬體加速。

跨來源資源共享 (CORS)

#

CORS 是一種瀏覽器用於控制一個網站如何存取另一個網站資源的機制。它的設計方式是,預設情況下,不允許一個網站使用 XHRfetch 對另一個網站發出 HTTP 請求。
這可以防止其他網站上的腳本代表使用者操作,以及未經許可存取其他網站的資源。

在網頁上,Flutter 使用 CanvasKit 或 skwasm(在使用 Wasm 時)渲染器來渲染應用程式。它們都依賴 WebGL。WebGL 需要存取原始圖片資料(位元組),才能夠渲染圖片。因此,圖片必須僅來自具有設定為與您的應用程式服務網域搭配使用的 CORS 政策的伺服器。

解決方案

#

在 Flutter 中有多種解決方案可以繞過 CORS 限制。

記憶體內、資源和同源網路圖片

#

如果應用程式在記憶體中具有編碼圖片的位元組,以 資源 的形式提供,或儲存在為應用程式提供服務的同一伺服器上(也稱為同源),則無需額外努力。可以使用 Image.memoryImage.assetImage.network 來顯示圖片。

將圖片託管在啟用 CORS 的 CDN 中

#

通常,可以將內容傳遞網路 (CDN) 設定為自訂允許哪些網域存取您的內容。例如,Firebase 網站託管允許在 firebase.json 檔案中指定自訂 Access-Control-Allow-Origin 標頭。

如果您無法控制來源伺服器,請使用 CORS 代理

#

如果無法設定圖片伺服器以允許來自您的應用程式的 CORS 請求,您可能仍然可以通過將請求代理到另一個伺服器來載入圖片。這要求中間伺服器具有足夠的存取權限來載入圖片。

當原始圖片伺服器公開提供圖片,但未設定正確的 CORS 標頭時,可以使用此方法。

範例

使用 HTML 平台視圖

#

如果其他解決方案都不適用於您的應用程式,Flutter 支援使用 HtmlElementView 將原始 HTML 嵌入應用程式內部。使用它來建立 <img> 元素以從其他網域渲染圖片。