我想从远程网址获取实际的文件扩展名。
有时扩展名不是有效格式。
例如,我从下面的网址中遇到问题
1) http://tctechcrunch2011.files.wordpress.com/2011/09/media-upload.png?w=266
2) http://0.gravatar.com/avatar/a5a5ed70fa7c651aa5ec9ca8de57a4b8?s=60&d=identicon&r=G
我想从远程网址下载/保存远程图像..
如何从上面的网址获取文件名和扩展名?
谢谢你 阿布舍克巴克
答案 0 :(得分:6)
远程服务器发送包含资源的mime类型的Content-Type
标头。例如:
Content-Type: image/png
因此,您可以检查此标头的值,并为您的文件选择正确的扩展名。例如:
WebRequest request = WebRequest.Create("http://0.gravatar.com/avatar/a5a5ed70fa7c651aa5ec9ca8de57a4b8?s=60&d=identicon&r=G");
using (WebResponse response = request.GetResponse())
using (Stream stream = response.GetResponseStream())
{
string contentType = response.ContentType;
// TODO: examine the content type and decide how to name your file
string filename = "test.jpg";
// Download the file
using (Stream file = File.OpenWrite(filename))
{
// Remark: if the file is very big read it in chunks
// to avoid loading it into memory
byte[] buffer = new byte[response.ContentLength];
stream.Read(buffer, 0, buffer.Length);
file.Write(buffer, 0, buffer.Length);
}
}
答案 1 :(得分:0)
如果您想从网址中提取扩展程序,可以使用VirtualPathUtility。
var ext = VirtualPathUtility.GetExtension(pathstring)
或使用标头来确定内容类型。有一个Windows API可以将内容类型转换为扩展名(它也在注册表中),但对于Web应用程序,使用映射是有意义的。
switch(response.ContentType)
{
case "image/jpeg":
return ".jpeg";
case "image/png":
return ".png";
}