У меня есть приложение формы Windows С#, которое загружает файл с url (приложение asp.net), но оно не возвращает полное изображение. Скажем, изображение имеет размер 780 кбайт, который создает форма окна, составляет 381 байт.
Я не могу понять эту проблему. Пожалуйста помоги.
Код, который я использую для загрузки:
public bool getFileFromURL(string url, string filename)
{
long contentLength = 0;
Stream stream = null;
try
{
WebRequest req = WebRequest.Create(url);
WebResponse response = req.GetResponse();
stream = response.GetResponseStream();
contentLength = response.ContentLength;
// Transfer the file
byte[] buffer = new byte[10 * 1024]; // 50KB at a time
int numBytesRead = 0;
long totalBytesRead = 0;
using (FileStream fileStream = new FileStream(filename, FileMode.Create))
{
using (BinaryWriter fileWriter = new BinaryWriter(fileStream))
{
while (stream.CanRead)
{
numBytesRead = stream.Read(buffer, 0, buffer.Length);
if (numBytesRead == 0) break;
totalBytesRead += numBytesRead;
fileWriter.Write(buffer, 0, numBytesRead);
}
fileWriter.Close();
}
fileStream.Close();
}
stream.Close();
response.Close();
req.Abort();
return true;
}
catch (Exception)
{
return false;
}
}
Это мой код приложения asp.net:
using (PortalEntities db = new PortalEntities())
{
PortalModel.Command command = db.Commands.SingleOrDefault(c => c.id == id);
var filePath = Server.MapPath("~/Uploads/"+command.arguments);
if (!File.Exists(filePath))
return;
var fileInfo = new System.IO.FileInfo(filePath);
Response.ContentType = "image/jpg";
Response.AddHeader("Content-Disposition", String.Format("attachment;filename=\"{0}\"", filePath));
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.WriteFile(filePath);
Response.End();
}
Это ужасно много кода для написания нескольких байтов в файл из веб-ответа. Как насчет чего-то подобного (.NET 4+):
public static bool GetFileFromURL(string url, string filename)
{
try
{
var req = WebRequest.Create(url);
using (Stream output = File.OpenWrite(filename))
using (WebResponse res = req.GetResponse())
using (Stream s = res.GetResponseStream())
s.CopyTo(output);
return true;
}
catch
{
return false;
}
}
try/catch
)?
Чувак, почему вы не используете WebClient.DownloadFileAsync?
private void DownloadFile(string url, string path)
{
using (var client = new System.Net.WebClient())
{
client.DownloadFileAsync(new Uri(url), path);
}
}
Это довольно много, но этот метод не может загружать более 2 ГБ. Но я не думаю, что изображение - это большой xD.
Надеюсь, поможет!
Вы можете загрузить изображение более изящным способом, о котором здесь говорилось выше. Невозможно найти FromStream в классе Image
И используйте метод File.WriteAllBytes для сохранения массива байтов в виде файла, более подробную информацию см. По адресу http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes(v=vs.110).aspx
Таким образом, весь ваш клиентский код можно заменить на
public void getFileFromURL(string url, string filename)
{
using (var webClient = new WebClient())
{
File.WriteAllBytes(filename,webClient.DownloadData(url));
}
}