Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用httpwebrequest将图像从网站拉到本地文件_C#_Image_File_Httpwebrequest - Fatal编程技术网

C# 如何使用httpwebrequest将图像从网站拉到本地文件

C# 如何使用httpwebrequest将图像从网站拉到本地文件,c#,image,file,httpwebrequest,C#,Image,File,Httpwebrequest,我正在尝试使用本地的c#应用程序将网站上的一些图像提取到本地计算机上的文件中。我正在使用下面列出的代码。我尝试了ASCII编码和UTF8编码,但最终的文件不是正确的。有人知道我做错了什么吗?当我把地址放在浏览器中时,url是活动的、正确的,并且图像显示得很好 private void button1_Click(object sender, EventArgs e) { HttpWebRequest lxRequest = (HttpWebRequest)WebR

我正在尝试使用本地的c#应用程序将网站上的一些图像提取到本地计算机上的文件中。我正在使用下面列出的代码。我尝试了ASCII编码和UTF8编码,但最终的文件不是正确的。有人知道我做错了什么吗?当我把地址放在浏览器中时,url是活动的、正确的,并且图像显示得很好

    private void button1_Click(object sender, EventArgs e)
    {
        HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");

        // returned values are returned as a stream, then read into a string
        String lsResponse = string.Empty;
        HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse();
        using (StreamReader lxResponseStream = new StreamReader(lxResponse.GetResponseStream()))
        {
            lsResponse = lxResponseStream.ReadToEnd();
            lxResponseStream.Close();
        }

        byte[] lnByte = System.Text.UTF8Encoding.UTF8.GetBytes(lsResponse);

        System.IO.FileStream lxFS = new FileStream("34891.jpg", FileMode.Create);
        lxFS.Write(lnByte, 0, lnByte.Length);
        lxFS.Close();

        MessageBox.Show("done");
    }
不错的图片:D

请尝试使用以下代码:

您需要使用BinaryReader,因为图像文件是二进制数据,因此不以UTF或ASCII编码

编辑:使用“编辑”

HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create(
"http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");

// returned values are returned as a stream, then read into a string
String lsResponse = string.Empty;
using (HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse()){
   using (BinaryReader reader = new BinaryReader(lxResponse.GetResponseStream())) {
      Byte[] lnByte = reader.ReadBytes(1 * 1024 * 1024 * 10);
      using (FileStream lxFS = new FileStream("34891.jpg", FileMode.Create)) {
          lxFS.Write(lnByte, 0, lnByte.Length);
      }
   }
}
MessageBox.Show("done");

好的,这是最后的答案。它使用memorystream作为缓冲来自reaponsestream的数据的方法

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] lnBuffer;
        byte[] lnFile;

        HttpWebRequest lxRequest = (HttpWebRequest)WebRequest.Create("http://www.productimageswebsite.com/images/stock_jpgs/34891.jpg");
        using (HttpWebResponse lxResponse = (HttpWebResponse)lxRequest.GetResponse())
        {
            using (BinaryReader lxBR = new BinaryReader(lxResponse.GetResponseStream()))
            {
                using (MemoryStream lxMS = new MemoryStream())
                {
                    lnBuffer = lxBR.ReadBytes(1024);
                    while (lnBuffer.Length > 0)
                    {
                        lxMS.Write(lnBuffer, 0, lnBuffer.Length);
                        lnBuffer = lxBR.ReadBytes(1024);
                    }
                    lnFile = new byte[(int)lxMS.Length];
                    lxMS.Position = 0;
                    lxMS.Read(lnFile, 0, lnFile.Length);
                }
            }
        }

        using (System.IO.FileStream lxFS = new FileStream("34891.jpg", FileMode.Create))
        {
            lxFS.Write(lnFile, 0, lnFile.Length);
        }
        MessageBox.Show("done");
    }

答案的变体,使用异步等待异步文件I/O。关于为什么这很重要

下载png并使用BinaryReader/Writer写入磁盘 读取所有字节扩展方法
公共静态类扩展{
公共静态异步任务ReadAllBytes(此二进制读取器)
{
常量int bufferSize=4096;
使用(var ms=new MemoryStream())
{
字节[]缓冲区=新字节[bufferSize];
整数计数;
while((count=reader.Read(buffer,0,buffer.Length))!=0){
等待ms.WriteAsync(缓冲区,0,计数);
}
返回ToArray女士();
}
}
}

您可以使用以下方法从网站下载图像并使用图像类进行保存:

WebRequest req = WebRequest.Create(imageUrl);
WebResponse resp = req.GetResponse();
Image img = Image.FromStream(resp.GetResponseStream());
img.Save(filePath +  fileName + ".jpg");

顺便说一句,您的HttpWebResponse和FileStream对象需要使用块,因为它们实现IDisposable。另外,为什么要初始化lsResponse,因为它将始终被设置(否则将引发异常)。最后,我建议您停止使用匈牙利符号(lxFS),您不需要前缀来了解每个对象的类型。1:我知道你只是在修改他提供的代码,但你真的应该改进它以避免资源泄漏。告诉他使用块将
放在哪里,我将删除我的否决票。我喜欢使用.Close方法而不是使用块。根据msdn:Close的这个实现调用Dispose方法,并传递一个真值。因此,根据我们的经验,我们应该没事。使用块是否比.Close()更安全或更具优势?(编辑:忘记一次关闭)@henchman:a
使用
块确保调用
Dispose
,即使存在未处理的异常。在几乎所有适当的情况下都不使用它们是一个坏习惯(当您创建实现
IDisposable
的类的实例时,只将其分配给局部变量,而不从创建它的方法返回它,并且当它不是WCF代理实例时)。如果你总是使用它,你不会忘记一两次。谢谢大家的回答。我认为John关于使用块的观点是正确的,即使使用.close方法。我认为当变量超出范围时,会立即执行dispose,而不是在例程结束时进行dispose。我还认为我将处理例程的ReadBytes部分,将流分块读取,直到其结束,而不是假定10MB限制。请让我们了解您针对10MB限制的解决方案-我找不到适用于这种类型的读卡器/流组合的解决方案。流。长度不可用。使用块看起来也比.Close()更好,不过当更多的块聚集在缩进中时可能会很有趣:-)哦,是的。。。现在我正在使用using块,忘记删除close方法了。
public static class Extensions {

    public static async Task<byte[]> ReadAllBytes(this BinaryReader reader)
    {
        const int bufferSize = 4096;
        using (var ms = new MemoryStream())
        {
            byte[] buffer = new byte[bufferSize];
            int count;
            while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) {
                await ms.WriteAsync(buffer, 0, count);
            }
            return ms.ToArray();
        }
    }
}
WebRequest req = WebRequest.Create(imageUrl);
WebResponse resp = req.GetResponse();
Image img = Image.FromStream(resp.GetResponseStream());
img.Save(filePath +  fileName + ".jpg");