Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
rednes
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 20
1

Отправка POST данных и файлов более 24 Мб и без утечек памяти

24.05.2012, 19:29. Просмотров 619. Ответов 5
Метки нет (Все метки)

Всем привет, есть класс который отправляет POST с полями и файлом, все бы хорошо, да вот есть 2 проблемы:
1. утечка памяти, при отправке файлов растет объем занимаемой памяти
2. не отправляются файлы больше 24 Мб

Код класса тут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
 
namespace ShotNes
{
    class Uploader
    {
        
        private MainForm m_MainForm;
        private bool show_info;
 
        public Uploader(MainForm frm, bool show = true)
        {
            m_MainForm = frm;
            show_info = show;
        }
 
        /// <summary>
        /// A method to upload files to the remote server streaming.
        /// </summary>
        public string UploadFilesToRemoteUrl(string url, FileStream fileStream, NameValueCollection nvc, string filename = "")
        {
            string responseString = "";
            try
            {
                // Create a boundry
                string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
 
                // Create the web request
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
 
                httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
 
                httpWebRequest.Method = "POST";
                httpWebRequest.KeepAlive = false;
 
                // Get the boundry in bytes
                byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
 
                // Get the header for the file upload
                string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
 
                // Add the filename to the header
                string header = string.Format(headerTemplate, "file", filename);
 
                //convert the header to a byte array
                byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
 
                string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
 
                string[] formitems = new string[nvc.Count];
 
                int c = 0;
                int formitems_len = 0;
                foreach (string key in nvc.Keys)
                {
                    formitems[c] = string.Format(formdataTemplate, key, nvc[key]);
                    formitems_len += formitems[c].Length;
                    c++;
                }
 
                // Add all of the content up.
                httpWebRequest.ContentLength = fileStream.Length + headerbytes.Length + (boundarybytes.Length * 2) + 2 + formitems_len;
 
                // Get the output stream
                using (Stream requestStream = httpWebRequest.GetRequestStream())
                {
 
                    foreach (string key in nvc.Keys)
                    {
                        string formitem = string.Format(formdataTemplate, key, nvc[key]);
                        byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                        requestStream.Write(formitembytes, 0, formitembytes.Length);
                    }
 
                    // Write out the starting boundry
                    requestStream.Write(boundarybytes, 0, boundarybytes.Length);
 
                    // Write the header including the filename.
                    requestStream.Write(headerbytes, 0, headerbytes.Length);
 
                    // Use 4096 for the buffer
                    byte[] buffer = new byte[4096];
 
                    int bytesRead = 0;
                    long total = fileStream.Length;
                    long totalBytesRead = 0;
 
                    // Loop through whole file uploading parts in a stream.
                    while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                    {
                        totalBytesRead += bytesRead;
                        if (show_info)
                        {
                            m_MainForm.form_upload.progressBar.Value = (int)(100 * totalBytesRead / total);
                            m_MainForm.form_upload.upload_per.Text = (100 * totalBytesRead / total).ToString() + "%";
                            m_MainForm.m_menu.MenuItems[0].Text = m_MainForm.langs.GetString("Uploading") + m_MainForm.form_upload.upload_per.Text;
                        }
                        requestStream.Write(buffer, 0, bytesRead);
                        
                        requestStream.Flush();
                        if (m_MainForm.upload_cancel)
                        {
                            requestStream.Close();
                            httpWebRequest.Abort();
                            return "canceled";
                        }
                    }
 
                    boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
 
                    // Write out the trailing boundry
                    requestStream.Write(boundarybytes, 0, boundarybytes.Length);
 
                    // Close the request and file stream
                    requestStream.Close();
                    fileStream.Close();
                }
                WebResponse webResponse = httpWebRequest.GetResponse();
 
                using (Stream responseStream = webResponse.GetResponseStream())
                {
                    using (StreamReader responseReader = new StreamReader(responseStream))
                    {
                        responseString = responseReader.ReadToEnd();
                    }
                }
                // Close response object.
                webResponse.Close();
 
                // clear resourses
                fileStream.Dispose();
 
                boundary = null;
                webResponse = null;
                boundarybytes = null;
                nvc = null;
                formitems = null;
                formdataTemplate = null;
                headerbytes = null;
                httpWebRequest = null;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + " / " + ex.InnerException.Message);
            }
            return responseString;
        }
    }
}
не могу понять в чем проблема у меня...
при отправке файлов больше 24 Мб, возникает след. исключение
0
Миниатюры
Отправка POST данных и файлов более 24 Мб и без утечек памяти  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2012, 19:29
Ответы с готовыми решениями:

Как грамотно писать код, без утечек памяти?
Даже не знаю как спросить... В общем началось все с того, что обнаружил утечку памяти после того...

Отправка более, чем одного POST запроса
Помогите написать код, отправки Post запросов многопоточно, С возможностью выбора количества...

Отправка POST запроса без показа страницы
Подскажите как проще всего отправить POST запрос (открыть страницу вида &quot;сайт/&amp;параметр=значение&quot;)...

Отправка post-запроса без обновления страницы
подскажите как отправить post запрос но только чтобы страница с которой он был отправлен не...

Отправка post запроса без перезагрузки страницы
недавно задавал вопрос про отправку post запроса без перезагрузки страницы. Сказали ищи в...

5
dondublon
2261 / 1193 / 246
Регистрация: 17.03.2012
Сообщений: 7,074
Записей в блоге: 5
25.05.2012, 07:30 2
термин "утечка памяти" обозначает немного другое.
у вас просто большой расход.
0
Slap
177 / 173 / 14
Регистрация: 17.01.2011
Сообщений: 349
25.05.2012, 09:01 3
rednes, нет сейчас возможности тестировать код, но есть вопрос: уходит ровно 24 мегабайта или с текущей скоростью уходит примерно 24 мегабайта? Если второе, то может таймаут на стороне сервера срабатывает?
0
rednes
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 20
25.05.2012, 12:06  [ТС] 4
Slap, была мысль что все дело в сервере, но отправляем форму с помощью html все ок, а именно с программы вот такой трабл.
dondublon, по логике вещей, буфер всегда перезаписывается, а в моем случае до отправки файла программа ест 9Мб памяти, после отправки файла уже к примеру 30Мб.. значит что-то не так, но где? Я все что можно уже очищаю (как мне кажется) но проблема по прежнему есть
0
dondublon
2261 / 1193 / 246
Регистрация: 17.03.2012
Сообщений: 7,074
Записей в блоге: 5
25.05.2012, 12:34 5
rednes, ну тогда правда утечки, прошу прощения. даж не знаю.
0
rednes
2 / 2 / 0
Регистрация: 24.05.2012
Сообщений: 20
25.05.2012, 15:50  [ТС] 6
может кто-то может подсказать 100% хорошо работающий класс для моих задач?
0
25.05.2012, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2012, 15:50

Отправка файлов на почту методом Post через форму
Здравствуйте. Имею форму (выложила нужный кусок) &lt;form enctype=&quot;multipart/form-data&quot;...

Отправка значения <select> в текущий документ, без рефреша, методом POST
Добрый вечер, не могу решить задачу. Имеется вот такая форма: &lt;div class=&quot;sort&quot;&gt;...

Отправка post данных
Для отправки использую isomorphic-fetch. Нужно отправить ПОСТом данные, но до сервера почему-то не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru