Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка файлов через POST через WebBrowser 
V
    Опции темы
DoKZ
Дата 9.7.2013, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.7.2013

Репутация: нет
Всего: нет



Занялся проектом на VB.NET и подошел к нему достаточно странно. 
Данные на сервере почти не меняются и не обрабатываются, да и я слаб в сокетных соединениях на VB (я знаю все языки программирования, но по чуть-чуть), поэтому писать сервер-приложение стало лень, ASP.NET тоже не догнал. Поэтому "сервер" представляет из себя несколько PHP-файлов, лежащих на хостинге, которые генерируют текстовый ответ (не HTML, без тэгов), а программа уже парсит этот ответ. Например, файл "/UserHasAccessToTest.php?login=dokz&testid=50" выдаст просто plain "YES" или "NO", что попадёт в System.Net.WebResponse, а оттуда в булеан и т д.
Вопрос 1: Это, вообще, нормальный подход или это совсем извращение и стоит всё по-нормальному написать?  smile 

Вопрос 2: Теперь появилась такая проблема. Мне нужно залить файл на сервер. FTP нет. Предположим, это Денвер. 
Я создал форму с стандартным POST-запросом для аплоада. Теперь мне надо на скрытой форме с компонентом WebBrowser открыть эту страницу, указать как-то путь к файлу и нажать "аплоад". Я реализовал это с помощью реальной формы и имитации движения мыши и кликов через Cursor, но смотрится ужасно.

Спасибо заранее за ответ smile

Это сообщение отредактировал(а) DoKZ - 9.7.2013, 19:15
PM MAIL   Вверх
diadiavova
Дата 9.7.2013, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5820
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(DoKZ @  9.7.2013,  20:03 Найти цитируемый пост)
Это, вообще, нормальный подход или это совсем извращение и стоит всё по-нормальному написать? 

Обычно в таких случаях создается либо веб-служба, либо WCF-служба. Можно в рамках ASP.Net MVC создать вебапи, но то что делаешь ты может сойти только в очень простых случаях. Порекомендовать что-то для пхп я не могу, так как не знаю какие там есть возможности, это надо в соответствующем разделе спрашивать. 
Является ли это извращением? На мой взгляд да, но это не значит, что такой подход нельзя использовать. Если он решает твои задачи и является наиболее простым в реализации, то возможно это не так уж и плохо. Проблему я здесь вижу только в том, что задачи могут измениться и логику приложения придется усложнить настолько, что проще будет переписать и сделать все нормально.
Парсить собственный текстовый формат - точно не есть хорошо, обычно для этих целей используется XML или JSON, последний удобнее для аякса на вебстраницах, но фреймворк располагает инструментами для работы с ним, так что тоже можно использовать.
Цитата(DoKZ @  9.7.2013,  20:03 Найти цитируемый пост)
Предположим, это Денвер.

Если ты не имеешь в виду город в США, то видимо надо пояснить что это.
Цитата(DoKZ @  9.7.2013,  20:03 Найти цитируемый пост)
Я создал форму с стандартным POST-запросом для аплоада. Теперь мне надо на скрытой форме с компонентом WebBrowser открыть эту страницу, указать как-то путь к файлу и нажать "аплоад". Я реализовал это с помощью реальной формы и имитации движения мыши и кликов через Cursor, но смотрится ужасно.

Звучит не менее ужасно. Все что делает браузер можно сделать WebRequest'ом, для этого надо изучить что отправляет на сервер браузер при отправке формы с аттачем. Для этого погугли что такое тип содержимого multipart/form-data и как в нем организованы данные, сформировать программно такой запрос вполне реально, а то и вовсе можно готовую библиотеку поискать, которая это делает.
В веббраузере вполне можно кликнуть по кнопке программно, а еще лучше программно отправить форму, ну что-то типа
Код

WebbBrowser1.Document.GetElementById("myForm").DomElement.submit()
Код приблизительный ессно, но я думаю понятный.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
DoKZ
Дата 10.7.2013, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.7.2013

Репутация: нет
Всего: нет



Под Денвером имел в виду локальный сервер (http://denwer.ru)  smile 
Проблема решена сама собой. Точнее, благодаря гуглу и западным форумам. 
Всё оказалось очень просто, как Вы и говорили - WebRequest с нужными параметрами. 
Самой большой проблемой было понять как передать имя поля (которое здесь userfile):
Код

$_FILES["userfile"]["tmp_name"]

Оказывается, вот так:
Код

header.Append("Content-Disposition: form-data; name=""userfile"";")


Спасибо Вам большое за ответ, очень помогли, почитал про всё это, вроде чуть больше понял.

P.S. Может кому понадобится, полный код функции, полезная штука. Передаются путь к файлу и урл. Возвращает ответ, лучше сделать не String, а потоком, но мне было не критично.
Код

Public Function UploadFile(ByVal FilePath As String, ByVal URL As String) As String
        Dim boundary As String = IO.Path.GetRandomFileName
        Dim header As New System.Text.StringBuilder()

        header.AppendLine("--" & boundary)
        header.Append("Content-Disposition: form-data; name=""userfile"";")
        header.AppendFormat("filename=""{0}""", IO.Path.GetFileName(FilePath))
        header.AppendLine()
        header.AppendLine("Content-Type: application/octet-stream")
        header.AppendLine()

        Dim headerbytes() As Byte = System.Text.Encoding.UTF8.GetBytes(header.ToString)
        Dim endboundarybytes() As Byte = System.Text.Encoding.ASCII.GetBytes(vbNewLine & "--" & boundary & "--" & vbNewLine)

        Dim req As Net.HttpWebRequest = Net.HttpWebRequest.Create(URL)
        req.ContentType = "multipart/form-data; boundary=" & boundary
        req.ContentLength = headerbytes.Length + New IO.FileInfo(FilePath).Length + endboundarybytes.Length
        req.Method = "POST"

        Dim s As IO.Stream = req.GetRequestStream
        s.Write(headerbytes, 0, headerbytes.Length)
        Dim filebytes() As Byte = My.Computer.FileSystem.ReadAllBytes(FilePath)
        s.Write(filebytes, 0, filebytes.Length)
        s.Write(endboundarybytes, 0, endboundarybytes.Length)
        s.Close()

        'Get the responds of these request
        Dim resp As Net.HttpWebResponse = req.GetResponse()
        Dim sresp As IO.Stream = resp.GetResponseStream()
        Dim bytes(80000) As Byte
        sresp.Read(bytes, 0, 80000)

        Return System.Text.Encoding.ASCII.GetChars(bytes)
    End Function


Это сообщение отредактировал(а) DoKZ - 10.7.2013, 00:04
PM MAIL   Вверх
shurikv
Дата 10.7.2013, 06:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 18.4.2012

Репутация: нет
Всего: нет



А a делаю так. Файл PHP на сервере (upload.php):
Код

<?php
if (isset($_FILES['file'])) {
    if ($_FILES['file']['error'] == 0 && $_FILES['file']['size'] > 0) { 
        $path = basename($_FILES['file']['name']);
        if (@move_uploaded_file($_FILES['file']['tmp_name'], $path)) echo 'OK';
    }
}
На VB.NET (самый простой вариант)
Код

My.Computer.Network.UploadFile ("C:\file.txt", "http://www.mysait.ru/upload.php","","",True,500)
При этом выходит маленькое окошечко, где бежит процесс.
Есть еще два варианта через WebClient: 
1 - синхронный (программа ждет окончания процесса)
Код

Dim myWebClient As New WebClient()
Dim responseArray As Byte() = myWebClient.UploadFile(uriString, "POST", fileName)
Console.WriteLine(ControlChars.Cr + "Response Received.The contents of the file uploaded are: " & ControlChars.Cr & "{0}", System.Text.Encoding.ASCII.GetString(responseArray))
2 - ассинхронный (можно отслеживать процесс загрузки и отлавливать конец процесса)
Код

WebClient.UploadFileAsync - метод (uriString, "POST", fileName)
события:
UploadProgressChanged - изменился процент загрузки
UploadFileCompleted - конец загрузки файла
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1412 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.