C# 图像URL的contentType为;text/html";

C# 图像URL的contentType为;text/html";,c#,httpwebrequest,httpwebresponse,C#,Httpwebrequest,Httpwebresponse,我想实现一种从网站下载图像到笔记本电脑的方法 public static void DownloadRemoteImageFile(string uri, string fileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if ((response.StatusC

我想实现一种从网站下载图像到笔记本电脑的方法

public static void DownloadRemoteImageFile(string uri, string fileName)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if ((response.StatusCode == HttpStatusCode.OK ||
            response.StatusCode == HttpStatusCode.Moved ||
            response.StatusCode == HttpStatusCode.Redirect) &&
            response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
        {
             //if the remote file was found, download it
            using (Stream inputStream = response.GetResponseStream())
            using (Stream outputStream = File.OpenWrite(fileName))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;
                do
                {
                    bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                    outputStream.Write(buffer, 0, bytesRead);
                } while (bytesRead != 0);
            }
        }
}
但是
request
response
ContentType
不是“image/jpg”或“image/png”。它们总是“text/html”。我想这就是为什么我把它们保存到本地后,它们的内容不正确,我无法查看它们

这里有人能找到解决办法吗?
谢谢

您可以使用此代码-基于
JpegBitmapDecoder类

JpegBitmapDecoder decoder = new JpegBitmapDecoder(YourImageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
//here you can adjust your YourImageStreamSource with outputStream value

BitmapSource bitmapSource = decoder.Frames[0];

Image myImage = new Image();
myImage.Source = bitmapSource;
myImage.Save("YourImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

链接:

您可以使用此代码-基于
JpegBitmapDecoder类

JpegBitmapDecoder decoder = new JpegBitmapDecoder(YourImageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
//here you can adjust your YourImageStreamSource with outputStream value

BitmapSource bitmapSource = decoder.Frames[0];

Image myImage = new Image();
myImage.Source = bitmapSource;
myImage.Save("YourImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

链接:

尝试将内容类型设置为特定图像类型

Response.ContentType = "image/jpeg";

尝试将内容类型设置为特定图像类型

Response.ContentType = "image/jpeg";

您的代码还可以,但您试图做的事情通常被网站所有者认为是不受欢迎的行为。大多数网站希望你在网站上看到图片,但不要随意下载。你可以搜索你的问题所在地,了解你反对的技术和保护措施


我强烈建议您在继续之前,阅读网站上的使用协议或任何类似文档。

您的代码没有问题,但您尝试的行为通常被网站所有者视为不希望的行为。大多数网站希望你在网站上看到图片,但不要随意下载。你可以搜索你的问题所在地,了解你反对的技术和保护措施


我强烈建议您在继续之前,阅读您试图删除的站点上的使用协议或任何类似文档。

您希望从中获取图像的站点可能需要cookie。有时,当我们使用浏览器访问站点时,我们可能没有注意到它,但浏览器实际上会访问站点大约一毫秒,然后快速重新加载,同时获取cookie。但在再次加载站点之前,我们的浏览器会将cookie传递给它,站点会接受cookie并返回图像

更详细地说,这意味着您的方法只能完成浏览器实际工作的一半。2个GET请求方法中的一半。第一个是获取cookie,第二个是实际获取图像本身


信息来源(可能有点相关):

您希望从中获取图像的站点可能需要cookie。有时,当我们使用浏览器访问站点时,我们可能没有注意到它,但浏览器实际上会访问站点大约一毫秒,然后快速重新加载,同时获取cookie。但在再次加载站点之前,我们的浏览器会将cookie传递给它,站点会接受cookie并返回图像

更详细地说,这意味着您的方法只能完成浏览器实际工作的一半。2个GET请求方法中的一半。第一个是获取cookie,第二个是实际获取图像本身


信息来自(可能有点相关):

您可能希望将代码放入代码块中,并确保其格式正确。现在很难阅读。谢谢,我是新手,我正在学习正确地发布问题。很抱歉给您带来不便。您要将什么url传递给此?如果url没有承载jpeg,您将得到它承载的任何内容。也可能是站点需要身份验证才能下载图像。@feroze:下面是url示例。我认为它是jpg文件的宿主,您可能希望将代码放在代码块中,并确保其格式良好。现在很难阅读。谢谢,我是新手,我正在学习正确地发布问题。很抱歉给您带来不便。您要将什么url传递给此?如果url没有承载jpeg,您将得到它承载的任何内容。也可能是站点需要身份验证才能下载图像。@feroze:下面是url示例。我认为jpg文件的主机我的问题不是解码图像。这是关于我将响应另存为html类型和图像文件的方法,因此我无法访问它。示例:我的url是“”,我想将其保存到“C:\image.jpg”。网站上的原始图像是500KB,但使用我的方法后,我的image.jpg是1KB,我无法使用它。image.Save(“yourmage.jpg”,System.Drawing.Imaging.ImageFormat.Jpeg);我的问题不是解码图像。这是关于我将响应另存为html类型和图像文件的方法,因此我无法访问它。示例:我的url是“”,我想将其保存到“C:\image.jpg”。网站上的原始图像是500KB,但使用我的方法后,我的image.jpg是1KB,我无法使用它。image.Save(“yourmage.jpg”,System.Drawing.Imaging.ImageFormat.Jpeg);ContentType仅用于“获取”ContentType,不能用于设置响应的ContentType。在调用GetResponse()之前,我尝试为请求设置ContentType。但它也不起作用:(这是另一篇SO帖子,希望它能帮助你回复。ContentType只用于“获取”ContentType,我们不能用它为响应设置ContentType。我在调用GetResponse()之前尝试为请求设置ContentType。但它也不起作用:(这是另一篇SO帖子,希望它能帮助你。)