скачать онлайн изображение асинхронно в .Net - PullRequest
0 голосов
/ 23 июня 2010

Я нашел следующий пример асинхронной загрузки веб-страницы (строки):

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 ]

1 голос
/ 23 июня 2010

Может быть, вы можете использовать мой ответ на другой вопрос ( здесь ).Он запрашивает у API Google Maps изображение (URL) и преобразует байты в растровое изображение.

Соответствующий код:

async {
    let req = HttpWebRequest.Create(..URI HERE..)
    let! response = req.AsyncGetResponse()
    return new Bitmap(response.GetResponseStream())
} |> Async.RunSynchronously
1 голос
/ 23 июня 2010

Вы можете прочитать байты прямо из потока. StreamReader работает со строками. Это на самом деле наследует TextReader. Альтернативно посмотрите на использование BinaryReader, который работает на байтах.

(Поскольку вы пометили его как 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();
0 голосов
/ 23 июня 2010

Вы можете преобразовать поток в массив байтов следующим образом (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();
}
0 голосов
/ 23 июня 2010

Использование http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetresponse.aspx

Тогда вы просто GetResponseStream и читаете байты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...