我将位图图像存储在Azure blob存储中并将它们传送到.Net Micro Framework设备。由于设备的内存限制,我需要将文件分成块并将它们传送到设备,然后将它们重新组合到设备的microSD卡上。我在使用字节保真度方面遇到了麻烦,并且正在努力理解这种减少测试。
我在azure上有一个简单的位图:https://filebytetest9845.blob.core.windows.net/files/helloworld.bmp它只是“Hello World”字样的黑白位图。
这是我编写的一些测试代码,用于放入ASP .Net Web API并读取准备好分成块的字节。但要测试我只是将字节存储到本地文件。
[Route("api/testbytes/")]
[AcceptVerbs("GET", "POST")]
public void TestBytes()
{
var url = "https://filebytetest9845.blob.core.windows.net/files/helloworld.bmp";
var fileRequest = (HttpWebRequest) WebRequest.Create(url);
var fileResponse = (HttpWebResponse) fileRequest.GetResponse();
if (fileResponse.StatusCode == HttpStatusCode.OK)
{
if (fileResponse.ContentLength > 0)
{
var responseStream = fileResponse.GetResponseStream();
if (responseStream != null)
{
var contents = new byte[fileResponse.ContentLength];
responseStream.Read(contents, 0, (int) fileResponse.ContentLength);
if (!Directory.Exists(@"C:\Temp\Bytes\")) Directory.CreateDirectory(@"C:\Temp\Bytes\");
using (var fs = System.IO.File.Create(@"C:\Temp\Bytes\helloworldbytes.bmp"))
{
fs.Write(contents, 0, (int) fileResponse.ContentLength);
}
}
}
}
}
这是原始位图:
这是保存到磁盘的版本:
正如您所看到的那样,它们不同,但我的代码应该只保存逐字节副本。他们为什么不同?
答案 0 :(得分:1)
试试这个
var contents = new byte[fileResponse.ContentLength];
int readed = 0;
while (readed < fileResponse.ContentLength)
{
readed += responseStream.Read(contents, readed, (int)fileResponse.ContentLength - readed);
}
看起来无法在单Read
次通话中下载整个图像,您必须回忆它,直到整个图像都被下载。
答案 1 :(得分:1)
Atomosk是对的 - 单Read
次呼叫无法读取整个回复。如果您使用的是.NET 4+,那么您可以使用此代码来读取完整的响应流:
var fileResponse = (HttpWebResponse)fileRequest.GetResponse();
if (fileResponse.StatusCode == HttpStatusCode.OK)
{
var responseStream = fileResponse.GetResponseStream();
if (responseStream != null)
{
using (var ms = new MemoryStream())
{
responseStream.CopyTo(ms);
ms.Position = 0;
using (var fs = System.IO.File.Create(@"C:\Temp\Bytes\helloworldbytes.bmp"))
{
ms.CopyTo(fs);
}
}
}
}
使用此代码,您不需要知道内容长度,因为它并不总是可用。