代码之家  ›  专栏  ›  技术社区  ›  Yin Zhu

在.NET中异步下载在线图像

  •  0
  • Yin Zhu  · 技术社区  · 15 年前

    我发现下面的示例可以异步下载网页(字符串):

    let getImage (imageUrl:string) =
        async {
            try 
                let req = WebRequest.Create(imageUrl) :?> HttpWebRequest
                req.UserAgent <- "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
                req.Method <- "GET";
                req.AllowAutoRedirect <- true;
                req.MaximumAutomaticRedirections <- 4;
                let! response1 = req.AsyncGetResponse()
                let response = response1 :?> HttpWebResponse
                use stream = response.GetResponseStream()
                use streamreader = new System.IO.StreamReader(stream)
                return! streamreader.AsyncReadToEnd() // .ReadToEnd()
            with
                _ -> return "" // if there's any exception, just return an empty string
    
        }
    

    它返回一个字符串。但是,我需要异步下载一个在线图像(字节数组)。

    有人能给我一些提示吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    也许你可以用我的答案回答另一个问题( here )它向谷歌图表API请求一个图像(一个URL),并将字节转换为位图。

    相关规范:

    async {
        let req = HttpWebRequest.Create(..URI HERE..)
        let! response = req.AsyncGetResponse()
        return new Bitmap(response.GetResponseStream())
    } |> Async.RunSynchronously
    
        2
  •  1
  •   Mikael Svenson    15 年前

    您可以直接从流中读取字节。StreamReader处理字符串。它实际上继承了文本阅读器。另一种方法是使用字节工作的二进制阅读器。

    (既然您将它标记为C,我将用C编写代码示例。)

    Stream s = response.GetResponseStream()
    MemoryStream memStream = new MemoryStream();
    int bytesRead;
    byte[] buffer = new byte[0x1000];
    for (bytesRead = s.Read(buffer, 0, buffer.Length); bytesRead > 0; bytesRead = s.Read(buffer, 0, buffer.Length))
    {
        memStream.Write(buffer, 0, bytesRead);
    }
    s.Close();
    return memStream.ToArray();
    
        3
  •  0
  •   Lloyd    15 年前

    使用 http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx

    然后您只需获取responseStream并读取字节。

        4
  •  -1
  •   Sergej Andrejev    15 年前

    您可以将流转换成这样的字节数组(c)

    byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream(stream))
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
    
        var bytes = ms.ToArray();
    }