Невозможно получить полное изображение с сервера

1

У меня есть приложение формы 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();
        }
  • 0
    Какую версию .NET вы используете?
  • 0
    4,0 .............
Показать ещё 4 комментария
Теги:
winforms

3 ответа

1
Лучший ответ

Это ужасно много кода для написания нескольких байтов в файл из веб-ответа. Как насчет чего-то подобного (.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;
    }
}
  • 0
    все же файл, который я получил, имеет 381 байт. Может ли быть что-то не так с кодом asp.net?
  • 1
    Вам не хватает места на диске? Получаете ли вы какие-либо исключения из вышеуказанного метода (попробуйте удалить блок try/catch )?
Показать ещё 1 комментарий
0

Чувак, почему вы не используете WebClient.DownloadFileAsync?

private void DownloadFile(string url, string path)
{
    using (var client = new System.Net.WebClient())
    {
        client.DownloadFileAsync(new Uri(url), path);
    }
}

Это довольно много, но этот метод не может загружать более 2 ГБ. Но я не думаю, что изображение - это большой xD.

Надеюсь, поможет!

0

Вы можете загрузить изображение более изящным способом, о котором здесь говорилось выше. Невозможно найти 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));
    }
}
  • 0
    та же ошибка. все же файл, который я получил, имеет 381 байт. Может ли быть что-то не так с кодом asp.net?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню