#asp.net
#asp.net
Вопрос:
привет, эта функция загружает изображение из исходного кода и добавляет его в zip-файл. проблема в том, что иногда изображение выходит полностью испорченным (загружена 1/3, остальное пустое место), как будто загрузка не завершена. как я могу убедиться, что загрузка завершена, прежде чем двигаться дальше? Спасибо.
редактировать: у меня есть тайм-аут, поэтому он не будет ждать бесконечно. должен ли я просто продлить время ожидания? или есть способ получше?
public void addImage(string source, string destination)
{
if (isFinalized)
return;
try
{
WebRequest req = WebRequest.Create(source);
req.Timeout = 5000;
WebResponse resp = req.GetResponse();
BufferedStream reader = new BufferedStream(resp.GetResponseStream());
byte[] fileData = new byte[resp.ContentLength];
reader.Read(fileData, 0, fileData.Length);
zip.AddEntry(destination, fileData);
}
catch (Exception exp)
{
}
}
Комментарии:
1. Для начала избавьтесь от try / catch. Откуда вы знаете, что не видите исключений?
Ответ №1:
В вашем коде вам нужно проверить прочитанные байты и посмотреть, полностью ли вы получили свое изображение.
int FinalRead = reader.Read(fileData, 0, fileData.Length);
bool fImageIsOk = FinalRead == resp.ContentLength ;
Также я настоятельно рекомендую деформировать BufferedStream
с using
Я думаю, что пример кода на msdn содержит хороший пример.
Вот на чем вы должны сосредоточиться. Не пытайтесь получить доступ к одному вашему буферу. В конце вы можете проверить, полностью ли вы получили свою фотографию или нет. Вы также можете проверить, подключена ли другая часть к процессу IsClientConnected
int numBytesToRead = receivedData.Length;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = bufStream.Read(receivedData,0, receivedData.Length);
// The end of the file is reached.
if (n == 0)
break;
bytesReceived = n;
numBytesToRead -= n;
}