如何从url中获取图像的真实名称?



我有关于图像的下一个url:

https://i.discogs.com/HE17wcv1sG6NDK1WcVyoQjSqUGDZva3SYvm6vXoCMOo/rs:fit/g:sm/q:90/h:600/w:600/czM6Ly9kaXNjb2dz/LWRhdGFiYXNlLWlt/YWdlcy9SLTk2OTY5/NjktMTQ4NDkzNzkw/Ni00MDcyLmpwZWc.jpeg

如果我用导航器打开url,然后按右键将此图像保存在硬盘中,则导航器为该文件图像解决的名称是不同的。我如何在c#中获得文件的姓氏?

如果您设置使用WebClient,那么您可以将数据下载到内存中,检查Content-Disposition标头,然后相应地更改文件名。我已经添加了注释掉的部分,如果您异步使用此方法,您可以使用这些注释掉的部分来代替它们的同步对应部分。

// private static async Task DownloadImageAsync(string url, string folder)
private static void DownloadImage(string url, string folder)
{
var uri = new Uri(url);
string fileName = Path.GetFileName(uri.AbsolutePath);
WebClient client = new WebClient();
// byte[] fileData = await client.DownloadDataTaskAsync(url);
byte[] fileData = client.DownloadData(url);
string disposition = client.ResponseHeaders.Get("Content-Disposition"); // try to get the disposition
if (!string.IsNullOrEmpty(disposition) // check it has a value
&& ContentDispositionHeaderValue.TryParse(disposition, out var parsedDisposition) // check it can be parsed
&& !string.IsNullOrEmpty(parsedDisposition.FileName)) // check a filename is specified
{
fileName = parsedDisposition.FileName.Trim('"'); // replace the normal filename with the parsed one
}
// await File.WriteAllBytesAsync(Path.Combine(folder, fileName), fileData);
File.WriteAllBytes(Path.Combine(folder, fileName), fileData);
}

用法:DownloadImage(myurl, @"C:UsersMeDesktop");


也就是说,WebClient有点过时,您可能应该使用HttpClient进行较新的开发:

private static async Task DownloadImageAsync(string url, string folder)
{
var uri = new Uri(url);
string fileName = Path.GetFileName(uri.AbsolutePath);
using var response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
if (!string.IsNullOrEmpty(response.Content.Headers.ContentDisposition?.FileName))
{
fileName = response.Content.Headers.ContentDisposition.FileName.Trim('"');
}
using var outputFile = File.Create(Path.Combine(folder, fileName));
await response.Content.CopyToAsync(outputFile);
}

用法:await DownloadImageAsync(myurl, @"C:UsersMeDesktop");

Microsoft建议在整个应用程序(文档)中使用单个HttpClient的静态实例。但这确实有缺陷,因此根据您的应用程序,您可能想要研究使用IHttpClientFactory,它可以解决使用静态HttpClient所带来的问题。

最新更新