使用推荐人 Header 从 URL 加载图像
Load Image from URL with a Referrer Header
我需要从我的 CDN 下载静态图像并将它们显示在我的 Xamarin.Forms 视图中。我是 Xamarin 的新手,我很难弄清楚如何从从 HTTP 请求中提取的字节数组加载图像。
我的视图中有以下 XAML:
<ListView ItemsSource="{Binding Images}">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding .}">
</ImageCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在我后面的代码中,我正在获取图像并尝试绑定到 ImageSource
个实例的 Collection。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
public ObservableCollection<ImageSource> Images { get; set; } = new ObservableCollection<ImageSource>();
protected override async void OnAppearing()
{
base.OnAppearing();
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Referer", "https://foo.bar/");
var response = await client.GetAsync("https://foo.bar/library/5.jpg");
byte[] image = await response.Content.ReadAsByteArrayAsync();
var imageSource = ImageSource.FromStream(() => new MemoryStream(image));
this.Images.Add(imageSource);
}
}
当我这样做时,StackLayout 中的图像是空的。我知道我可以改为只绑定到 URL,ImageSource 可以为我下载它,但我需要传递 Referrer
Header。无论如何,我看不到强制 XAML Image
视图允许自定义 headers,如果我实例化 ImageSource
的实例,我也看不到这样做的方法] 在我后面的代码中。
当我阅读 ImageSource
上的文档时,它听起来好像只支持 URI、文件、流和应用程序资源来加载图像。因为我有一个字节数组,所以我将它包装在 MemoryStream
中并调用 ImageSource.FromStream
。虽然应用程序运行时没有加载 - ImageCell
为空。
我知道图像已下载。我将 byte[]
转换为 Base64 字符串,然后将其放入 Base64 to Image Decoder。图像加载没有问题,所以我知道它正在正确下载。我不明白的是为什么我无法在 ImageSource
.
上渲染图像
我也试过只使用普通的 Image
控件,但遇到了同样的问题。
<ScrollView>
<ContentView>
<StackLayout BindableLayout.ItemsSource="{Binding Images}" Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"></Image>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ContentView>
</ScrollView>
我是不是做错了什么,或者是从互联网上动态下载带有特殊 Header 的图像,这是我在 Xamarin.Forms 中做不到的?
尝试在页面构造函数中添加 this.BindingContext = this;
。
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
}
我需要从我的 CDN 下载静态图像并将它们显示在我的 Xamarin.Forms 视图中。我是 Xamarin 的新手,我很难弄清楚如何从从 HTTP 请求中提取的字节数组加载图像。
我的视图中有以下 XAML:
<ListView ItemsSource="{Binding Images}">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding .}">
</ImageCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在我后面的代码中,我正在获取图像并尝试绑定到 ImageSource
个实例的 Collection。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
public ObservableCollection<ImageSource> Images { get; set; } = new ObservableCollection<ImageSource>();
protected override async void OnAppearing()
{
base.OnAppearing();
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Referer", "https://foo.bar/");
var response = await client.GetAsync("https://foo.bar/library/5.jpg");
byte[] image = await response.Content.ReadAsByteArrayAsync();
var imageSource = ImageSource.FromStream(() => new MemoryStream(image));
this.Images.Add(imageSource);
}
}
当我这样做时,StackLayout 中的图像是空的。我知道我可以改为只绑定到 URL,ImageSource 可以为我下载它,但我需要传递 Referrer
Header。无论如何,我看不到强制 XAML Image
视图允许自定义 headers,如果我实例化 ImageSource
的实例,我也看不到这样做的方法] 在我后面的代码中。
当我阅读 ImageSource
上的文档时,它听起来好像只支持 URI、文件、流和应用程序资源来加载图像。因为我有一个字节数组,所以我将它包装在 MemoryStream
中并调用 ImageSource.FromStream
。虽然应用程序运行时没有加载 - ImageCell
为空。
我知道图像已下载。我将 byte[]
转换为 Base64 字符串,然后将其放入 Base64 to Image Decoder。图像加载没有问题,所以我知道它正在正确下载。我不明白的是为什么我无法在 ImageSource
.
我也试过只使用普通的 Image
控件,但遇到了同样的问题。
<ScrollView>
<ContentView>
<StackLayout BindableLayout.ItemsSource="{Binding Images}" Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"></Image>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ContentView>
</ScrollView>
我是不是做错了什么,或者是从互联网上动态下载带有特殊 Header 的图像,这是我在 Xamarin.Forms 中做不到的?
尝试在页面构造函数中添加 this.BindingContext = this;
。
public MainPage()
{
InitializeComponent();
this.BindingContext = this;
}