从“不太容易”的 CDN 下载图像的 C# 代码

Posted

技术标签:

【中文标题】从“不太容易”的 CDN 下载图像的 C# 代码【英文标题】:C# Code to download an image from a "not so easy" CDN 【发布时间】:2016-07-21 20:13:16 【问题描述】:

我正在尝试从特定网站下载图片。 实际上,我的代码已经在生产环境中运行了几个月,但它无法从这个特定的网站下载图像

我需要下载的图片网址是这个:(例如) http://static7.kabum.com.br/produtos/fotos/64297/64297_index_g.jpg

到目前为止我尝试过的代码:

方法一 ->(失败)

string url = "http://static7.kabum.com.br/produtos/fotos/64297/64297_index_g.jpg";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = (timeout == 0 ? 30 : timeout) * 1000;
request.KeepAlive = false;
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/48.0.2564.116 Safari/537.36";

var response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)

    const int BUFFER_SIZE = 16 * 1024;
    var buffer = new byte[BUFFER_SIZE];

    // if the remote file was found, download it
    using (Stream inputStream = response.GetResponseStream())
    using (Stream outputStream = File.Create(fileName, BUFFER_SIZE))
    
        int bytesRead;
        do
        
            bytesRead = inputStream.Read(buffer, 0, buffer.Length);
            outputStream.Write(buffer, 0, bytesRead);
         while (bytesRead != 0);
    

方法2 ->(同样失败)

[..]
using(Image webImage = Image.FromStream(response.GetResponseStream()))

    webImage.Save(fileName);

[..]

两种方法都失败,并显示以下exception

“Parameter not valid”异常加载System.Drawing.Image

StackTrace = " em System.Drawing.Image.FromStream(Stream 流, Boolean useEmbeddedColorManagement, Boolean validateImageData) in System.Drawing.Image.FromStream(Stream 流) 在 MonitorLib.Helper.RequestPageHelper.RequestDowloadPage(布尔代理, 字符串...

我猜图像数据不完整或压缩,但 URL 在任何浏览器上都可以正常工作

有什么想法吗? 非常感谢朋友

【问题讨论】:

【参考方案1】:

您可以使用 WebClient.DownloadFile() 方法。

var fileName = @"C:\path\to\file.jpg";
var url = "http://static7.kabum.com.br/produtos/fotos/64297/64297_index_g.jpg";

using (var client = new WebClient())

    client.DownloadFile(url, fileName);

【讨论】:

【参考方案2】:

这似乎是服务器响应错误标头的问题,浏览器可以忽略并过去。您需要告诉您的应用程序也这样做。有几种选择可以做到这一点。 The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF, In WinForms? 应该能够引导你走向正确的方向。

【讨论】:

同意,确实是问题的根源

以上是关于从“不太容易”的 CDN 下载图像的 C# 代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 CKEditor CDN 时如何从桌面上传 CKEditor 中的图像?

从 Azure Blob C# 下载图像

Azure CDN 不接受 C# 中 Imageresizer 插件的查询字符串参数

如何通过 CDN 在 Flutter 中添加图像

使用 Flask 和 JS 从服务器下载文件

一个C#的图片浏览器示例小程序(可源代码下载)