有没有办法可以检测图像 URL,例如:
http://mysite.com/image.jpg
但也有其他格式?我正在使用带有 .NET 4.0 的 C#。
就像是
bool isImageUrl(string URL){
}
编辑我的意思是如果 URL 指向图像。例如,网址
http://mysite.com/image.jpg
是一个有效的图像,但
http://mysite.com/image
不是。
可以用HEAD
Http的方法确定(不用下载整张图)
bool IsImageUrl(string URL)
{
var req = (HttpWebRequest)HttpWebRequest.Create(URL);
req.Method = "HEAD";
using (var resp = req.GetResponse())
{
return resp.ContentType.ToLower(CultureInfo.InvariantCulture)
.StartsWith("image/");
}
}
您可以向 URL 发送 HTTP 请求(使用HttpWebRequest
),并检查返回的是否ContentType
以image/
.
您当然可以简单地检查 URL 是否以已知的图像文件扩展名结尾。但是,更安全的方法是实际下载资源并检查您获得的内容是否实际上是图像:
public static bool IsUrlImage(string url)
{
try
{
var request = WebRequest.Create(url);
request.Timeout = 5000;
using (var response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
if (!response.ContentType.Contains("text/html"))
{
using (var br = new BinaryReader(responseStream))
{
// e.g. test for a JPEG header here
var soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8)
var jfif = br.ReadUInt16(); // JFIF marker (FFE0)
return soi == 0xd8ff && jfif == 0xe0ff;
}
}
}
}
}
catch (WebException ex)
{
Trace.WriteLine(ex);
throw;
}
return false;
}
您可以使用 .EndsWith() 为您定义的每个字符串检查字符串。
如果您想知道该 URL 上的对象是否实际上是图像,则必须自己执行 Web 请求并检查内容类型 HTTP 标头。
然而,即使这样也可能不准确,具体取决于服务器。
一个选项是使用 System.Net.Http 中的 HttpClient 而不是
HttpClient client = new HttpClient();
HttpResponseMessage res = await client.GetAsync("https://picsum.photos/200/300");
bool IsTypeImage = res.ToString().Contains("Content-Type: image");