Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
kosc
10 / 10 / 1
Регистрация: 01.11.2011
Сообщений: 97
1

Upload файлов через webBrowser

14.01.2012, 12:55. Просмотров 5142. Ответов 16
Метки нет (Все метки)

Я уже выцепил элемент вида
HTML5
1
<input type="file" name="file"><br>
Как HtmlElement, у меня есть адрес файла на пользовательском компе, теперь мне надо заставить программу загрузить этот файл через этот Html-элемент.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2012, 12:55
Ответы с готовыми решениями:

Upload файлов из WinForms апликации на Web сервер
Есть WinForms апликация, которая, между всем прочим, должна аплоадить файлы на Web сервер по HTTP...

Работа с html через webBrowser
Здрасте! Такая вот закавыка возникла. Хотел в html документе сверстать некий шаблон, ну например:...

Данные через AJAX в WebBrowser
Добрый день, уважаемые форумчане! Ситуация следующая: в WebBrowser грузиться сайт, необходимо...

комбобокс сайта, переключение через webbrowser
на сайте есть комбобокс... как мне переключать его значения использую компонент webbrowser на...

Программная авторизация на сайте через WebBrowser
Всем доброго времени суток.Не могу понять в чем у меня ошибка.Нужно программно авторизоваться на...

16
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
14.01.2012, 13:56 2
Здесь можно только через WinApi
Вот с помощью webBrowser1 происходит загрузка файлов на радикал
у таймера интервал поставить надо где то 500 mls.
и точно узнать имя файлового диалога у webBrowser1
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Media;
using System.Net;
using System.IO;
using System.Runtime.InteropServices;
 
namespace RadikalUpload
{
    public partial class Form1 : Form
    {
 
        public Form1()
        {
            InitializeComponent();
        }
        protected override void OnKeyDown(KeyEventArgs e)
        {
 
        }
 
        bool FileChoosed = false;
        string FileName = "";
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            foreach (HtmlElement jh in webBrowser1.Document.GetElementsByTagName("label"))
            {
                if (jh.GetAttribute("id") == "FLabel" && FileChoosed != true)
                {
                    timer1.Enabled = true;
                    FileChoosed = true;
                    FileName = "Scr05.jpg";  //имя загружаемого файла 
                    jh.InvokeMember("click");
 
                }
            }
        }
        private void InputFileName(string FileName)
        {
            IntPtr DialogHandle = FindWindow("#32770", "Choose File to Upload");//имя окна файлового диалога 
            if (DialogHandle == IntPtr.Zero)
            {
                MessageBox.Show("Dialog is not running.");
                return;
            }
            SetForegroundWindow(DialogHandle);
            string[] st = FileName.Split('.');
            SendKeys.Send(st[0]);
            SendKeys.Send("{.}");
            SendKeys.Send(st[1]);
            SendKeys.SendWait("{ENTER}");
        }
 
        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (FileName.Length > 0)
            {
                InputFileName(FileName);
                FileName = "";
            }
            else
            {
                foreach (HtmlElement jh in webBrowser1.Document.GetElementsByTagName("input"))
                {
                    if (jh.GetAttribute("value") == "Загрузить")
                    {
                        jh.InvokeMember("click");
                        timer1.Enabled = false;
                    }
                }
            }
        }
    }
}
1
kosc
10 / 10 / 1
Регистрация: 01.11.2011
Сообщений: 97
14.01.2012, 15:14  [ТС] 3
Что значит #32770(строка 47)?
Как я думаю, это что-то вроде идентификатора процесса, но как мне его узнать для моего диалога?
0
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
14.01.2012, 15:22 4
C#
1
2
3
IntPtr DialogHandle = FindWindow("#32770", "Choose File to Upload");
//#32770 - имя класса ,думаю у вас такой же 
//Choose File to Upload - заголовок окна файлового диалога вот он может быть другим,узнайте имя своего
1
14.01.2012, 15:22
Niades
86 / 72 / 6
Регистрация: 11.09.2011
Сообщений: 118
15.01.2012, 16:01 5
Зачем извращаться с WinApi, если можно отправить обыкновенный POST-запрос?
0
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
15.01.2012, 16:11 6
Niades,если так все просто ,может рабочий пример покажете для радикала ?
0
Niades
86 / 72 / 6
Регистрация: 11.09.2011
Сообщений: 118
15.01.2012, 16:59 7
Vitall, у меня есть готовый код для iPicture, под радикал, с Вашего позволения не буду переписывать.

Код
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
public class Uploader
    {
        public static string Upload(Image ImageToUpload)
        {
            byte[] BytesToUpload = ImageToByte(ImageToUpload);
            Browser browser = new Browser();
            browser.GET("http://ipicture.ru");
            string boundary = DateTime.Now.Ticks.ToString("x2");
            string data = PostData5.MultiFormData("method", "file", boundary);
            data += PostData5.MultiFormDataFile("userfile", Encoding.Default.GetString(BytesToUpload), "screenshot.png", "image/png", boundary);
            data += PostData5.MultiFormData("userurl[]", "", boundary);
            data += PostData5.MultiFormData("orig_resize", "800", boundary);
            data += PostData5.MultiFormData("rotate", "0", boundary);
            data += PostData5.MultiFormData("string_big", "Увеличить", boundary);
            data += PostData5.MultiFormData("galleries", "12", boundary);
            data += PostData5.MultiFormData("status", "on", boundary);
            data += PostData5.MultiFormData("quality", "85", boundary);
            data += PostData5.MultiFormData("thumb_resize_on", "on", boundary);
            data += PostData5.MultiFormData("thumb_resize", "180", boundary);
            data += PostData5.MultiFormData("string_small", "Увеличить", boundary);
            data += PostData5.MultiFormData("comment", "", boundary);
            data += PostData5.MultiFormData("tags", "", boundary);
            data += boundary + "--\r\n";
            string document = browser.MultipartFormPOST("http://ipicture.ru/Upload/", data, boundary);
            string link = new Regex("Refresh: 0;url=(.*?)\r\n").Match(document).Groups[1].Value;
            string anotherdocument = browser.GET(link);
            Match m = new Regex("<input type=\"text\" onClick=\"highlight.*?;\" size=\"85\" value=\"(.*?)\">\r\n").Match(anotherdocument);
            return ShortenLink(m.Groups[1].Value);
 
        }
 
        public static string ShortenLink(string link)
        {
            Browser browser = new Browser();
            browser.GET("http://*******");
            string doc = browser.POST("http://*******/api/shorten", "url=" + link + "&security_token");
            return new Regex("\"short_url\":\"(.*?)\"").Match(doc).Groups[1].Value;
        }
 
        public static byte[] ImageToByte(Image img)
        {
            byte[] byteArray;
            using (MemoryStream stream = new MemoryStream())
            {
                img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                stream.Close();
                byteArray = stream.ToArray();
            }
            return byteArray;
        }
    }
 
    public class Browser
    {
        public Browser()
        {
            Cookies = new CookieContainer();
            Randomize();
        }
 
        private CookieContainer Cookies;
 
        public string GET(string url)
        {
            try
            {
                HttpWebRequest hwrq = CreateRequest(url);
                hwrq.CookieContainer = Cookies;
                using (HttpWebResponse hwrs = (HttpWebResponse)hwrq.GetResponse())
                {
                    Cookies.Add(hwrs.Cookies);
                    using (StreamReader sr = new StreamReader(hwrs.GetResponseStream(), Encoding.UTF8))
                    {
                        return hwrs.Headers.ToString() + sr.ReadToEnd().Trim();
                    }
                }
            }
            catch
            {
                GET(url);
                return null;
            }
        }
 
        public string POST(string url, string query)
        {
            HttpWebRequest hwrq = CreateRequest(url);
            hwrq.CookieContainer = Cookies;
            hwrq.Method = "POST";
            hwrq.ContentType = "application/x-www-form-urlencoded";
            byte[] data = Encoding.UTF8.GetBytes(query);
            hwrq.ContentLength = data.Length;
            hwrq.GetRequestStream().Write(data, 0, data.Length);
            using (HttpWebResponse hwrs = (HttpWebResponse)hwrq.GetResponse())
            {
                Cookies.Add(hwrs.Cookies);
                using (StreamReader sr = new StreamReader(hwrs.GetResponseStream(), Encoding.UTF8))
                {
                    return hwrs.Headers.ToString() + sr.ReadToEnd().Trim();
                }
            }
        }
 
        public string MultipartFormPOST(string url, string query, string boundary)
        {
            HttpWebRequest hwrq = CreateRequest(url);
            hwrq.CookieContainer = Cookies;
            hwrq.Method = "POST";
            hwrq.ContentType = "multipart/form-data; boundary="+boundary;
            byte[] data = Encoding.GetEncoding(1251).GetBytes(query);
            hwrq.ContentLength = data.Length;
            hwrq.GetRequestStream().Write(data, 0, data.Length);
            using (HttpWebResponse hwrs = (HttpWebResponse)hwrq.GetResponse())
            {
                Cookies.Add(hwrs.Cookies);
                using (StreamReader sr = new StreamReader(hwrs.GetResponseStream(), Encoding.UTF8))
                {
                    return hwrs.Headers.ToString()+sr.ReadToEnd().Trim();
                }
            }
        }
 
        public Cookie GetCookie(string url, string name)
        {
            foreach (Cookie c in Cookies.GetCookies(new Uri(url)))
            {
                if (c.Name == name)
                    return c;
            }
            return null;
        }
 
        string UserAgent;
        string Accept;
        string AcceptLang;
        DecompressionMethods DMethod;
 
        private void Randomize()
        {
            string[] useragents = {
                                      "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.65 Safari/525.19",
                                      "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.503.0 Safari/534.6",
                                      "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13",
                                      "Mozilla/5.0 (Macintosh; U; PPC Max OS X Mach-O; en-US; rv:1.8.0.7) Gecko/200609211 Camino/1.0.3",
                                      "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1",
                                      "Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.7.62 Version/11.00",
                                      "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.5.18 Version/10.50"
                                  };
            string[] acceptlang = {
                                   "en-us;q=0.5,en;q=0.3",
                                   "ru-ru,ru; q=0.3",
                                   "q=0.8,en-us; q=0.3",
                                   "q=0.5,en"
                               };
            string[] accepts = {
                                  "application/json, text/javascript, */*; q=0.01",
                                  "*/*",
                                  "application/json, text/javascript, */*",
                                  "text/javascript, */*"
                              };
            DecompressionMethods[] dmethods = {
                                         DecompressionMethods.Deflate,
                                         DecompressionMethods.GZip,
                                         DecompressionMethods.None,
                                         (DecompressionMethods.Deflate | DecompressionMethods.GZip),
                                         (DecompressionMethods.Deflate | DecompressionMethods.None),
                                         (DecompressionMethods.GZip | DecompressionMethods.None)
                                     };
            AcceptLang = acceptlang[new Random().Next(acceptlang.Length)];
            UserAgent = useragents[new Random().Next(useragents.Length)];
            Accept = accepts[new Random().Next(accepts.Length)];
            DMethod = dmethods[new Random().Next(dmethods.Length)];
        }
 
        private HttpWebRequest CreateRequest(string url)
        {
            HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url);
            Request.UserAgent = UserAgent;
            Request.Accept = Accept;
            Request.Headers.Add("Accept-Language", AcceptLang);
            Request.AutomaticDecompression = DMethod;
            return Request;
        }
    }
 
    public class PostData5
    {
        private string s_method = String.Empty;
 
        public string Method
        {
            get
            {
                return this.s_method;
            }
        }
        private string s_action = String.Empty;
 
        public string Action
        {
            get
            {
                return this.s_action;
            }
        }
        public string Param
        {
            get
            {
                return this.s_param;
            }
        }
 
        private string s_param = String.Empty;
        public PostData5(string s_PostString)
        {
            if (s_PostString.IndexOf("=") != -1)
            {
                this.s_method = s_PostString.Substring(0, s_PostString.IndexOf("="));
                this.s_action = s_PostString.Substring(s_PostString.IndexOf("=") + 1);
                if (this.s_action.IndexOf("!") != -1)
                {
                    this.s_action = s_action.Substring(0, this.s_action.IndexOf("!"));
                    this.s_param = s_PostString.Substring(s_PostString.IndexOf("!") + 1);
                }
 
            }
 
        }
        public static string MultiFormData(string Key, string Value, string Boundary)
        {
            lock (typeof(PostData5))
            {
                string output = "--" + Boundary + "\r\n";
                output += "Content-Disposition: form-data; name=\"" + Key + "\"\r\n\r\n";
                output += Value + "\r\n";
                return output;
            }
        }
        public static string MultiFormDataFile(string Key, string Value, string FileName, string FileType, string Boundary)
        {
            lock (typeof(PostData5))
            {
                string output = "--" + Boundary + "\r\n";
                output += "Content-Disposition: form-data; name=\"" + Key + "\"; filename=\"" + FileName + "\"\r\n";
                output += "Content-Type: " + FileType + " \r\n\r\n";
                output += Value + "\r\n";
                return output;
            }
        }
    }





Кода достаточно много, т.к., копировал классами из проекта.
Сам проект можете посмотреть тут:
 Комментарий модератора 
Картинки и файлы загружайте на форум, во избежание их удаления или потери на сторонних ресурсах
Код пишем в редакторе сообщений
2
Вложения
Тип файла: rar SimpleScreenshotUploader.rar (130.3 Кб, 122 просмотров)
sau
2136 / 1708 / 294
Регистрация: 22.07.2011
Сообщений: 6,485
Завершенные тесты: 1
15.01.2012, 17:05 8
Браузер те же POST запросы делает, так что если проанализировать перечень отправляемых пакетов, скажем через снифер, то тупо можно делать тоже самое , например через WebClient-а.
И извраты с API действительно ни к чему.
0
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
15.01.2012, 18:51 9
Цитата Сообщение от Niades Посмотреть сообщение
Кода достаточно много, т.к.
И вправду достаточно ,надо еще с ним разобраться , ошибку сейчас выдает Error :1409 ,спасибо за пример
0
Niades
86 / 72 / 6
Регистрация: 11.09.2011
Сообщений: 118
15.01.2012, 20:10 10
Цитата Сообщение от Vitall Посмотреть сообщение
И вправду достаточно ,надо еще с ним разобраться , ошибку сейчас выдает Error :1409 ,спасибо за пример
У меня всё работает. Если мне не изменяет память, ошибка 1490 значит, что у Вас уже что-то есть на одном из хоткеев (Ctrl+F1\F2\F3). Просто смените их в коде программы на другие, вот и всё.
0
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
15.01.2012, 20:37 11
сменил на 0х73,формы не видно так и задумано ? иконку видно !
0
Niades
86 / 72 / 6
Регистрация: 11.09.2011
Сообщений: 118
15.01.2012, 20:47 12
Да, формы и не должно быть.
0
kosc
10 / 10 / 1
Регистрация: 01.11.2011
Сообщений: 97
16.01.2012, 14:49  [ТС] 13
На строке

C#
1
SendKeys.Send(st[0]);
Вылетает ошибка с текстом

"SendKeys cannot run inside this application because the application is not handling Windows messages. Either change the application to handle messages, or use the SendKeys.SendWait method."

Как реагировать?
0
Vitall
758 / 538 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
16.01.2012, 16:18 14
как советуют
C#
1
SendKeys.SendWait(st[0]);
1
kosc
10 / 10 / 1
Регистрация: 01.11.2011
Сообщений: 97
17.01.2012, 10:50  [ТС] 15
Оу, точно. Спасибо, не заметил.

Добавлено через 16 часов 44 минуты
Ура! Задача решена! =)
Ну плюсики я уже вроде расставил.
0
kosc
10 / 10 / 1
Регистрация: 01.11.2011
Сообщений: 97
18.01.2012, 15:20  [ТС] 16
Аа!!!
Опять всё поломалось!
Диалог вызывается, но имя файла не вводится. SendWait не помогает.
0
slawek
40 / 40 / 3
Регистрация: 08.01.2012
Сообщений: 96
18.01.2012, 21:12 17
Вот кусочек кода, когда то я эксперементировал.
Но потом решил идти другим путем.
Скажем так, полу рабочий, но думаю покажет вам напраление куда копать.

C#
1
2
3
4
5
6
7
8
var boundary = "---------------------------" + Guid.NewGuid().ToString();
byte[] file = File.ReadAllBytes("c:\\image.jpg");
var dataOut = boundary + Environment.NewLine;
dataOut += "Content-Disposition: form-data; name=\"FileUpload1\"; filename=\"image.jpg\"" + Environment.NewLine;
dataOut += "Content-Type: application/upload" + Environment.NewLine + Environment.NewLine;
dataOut += Encoding.Unicode.GetString(file) + Environment.NewLine + "--" + boundary + "--" + Environment.NewLine;
 
 wb.Navigate("http://localhost/site/upload.aspx", "", Encoding.Unicode.GetBytes(dataOut), "Content-Type: multipart/form-data; boundary=" + boundary + Environment.NewLine);
0
18.01.2012, 21:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 21:12

Загрузка изображения на сайт (можно через Webbrowser)
Всем привет, делаю автоматический постинг на сайте сделал авторизацию, сам постинг , потом меня...

Как корректно работать с httpWebRequest через webbrowser ?
Здравствуйте. Хочу получить страницу оплаты по запросу и отобразить её в компоненте webBrowser: ...

Upload файлов на сервер
У меня вопрос: как загрузить файл на сервер, и при этом проверить его расширение?


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

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

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