Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.184.214] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Как программно отправить файл на HTTP-сервер, не указывая при этом пароль. В PHP есть метод POST, позволяющий отправить файл на сервер, а чисто программно - это возможно?
|
Сообщ.
#3
,
|
|
|
B.V., в примере указывается пароль!!! А мне нужно без ввода пароля!!!
|
Сообщ.
#4
,
|
|
|
Цитата salieri @ B.V., в примере указывается пароль!!! А мне нужно без ввода пароля!!! с пустым паролем? Или с автоматическим пробрасыванием? |
Сообщ.
#5
,
|
|
|
Spawn.NET, скорее с автоматическим. т.к. нужно просто указать путь на сервер, файл и логин, а программа сама должна его перекинуть
|
Сообщ.
#6
,
|
|
|
это пипец.
|
Сообщ.
#7
,
|
|
|
nash, Вы хотите сказать - это невозможно?? А как же PHP работает??
|
Сообщ.
#8
,
|
|
|
Нет, он говорит, что Вам лень самому разбираться...
|
Сообщ.
#9
,
|
|
|
Spawn.NET, я бы с радостью разобраться, только информации в интернете нет по этому поводу.
|
Сообщ.
#10
,
|
|
|
Цитата salieri @ т.к. нужно просто указать путь на сервер, файл и логин, а программа сама должна его перекинуть угу, только вот не зная пароль, если таковой имеется, система отправит Вас, а не файл и далеко не на сервер... Добавлено Ну да, а ещё существует анонимный метод входа, но это Вы лучше отдельно почитайте. Ликбез по принципам работы FTP-серверов в институте слушайте... |
Сообщ.
#11
,
|
|
|
Цитата salieri @ А как же PHP работает?? Не "как", а "где". На сервере. А твой код будет работать на клиенте. Это, как говорят в Одессе, две большие разницы... |
Сообщ.
#12
,
|
|
|
Я же могу послать команду на FTP-сервер функцией FtpCommand, а по протоколу "POST" я разве не могу связываться с сервером? Ведь браузер же стоит на клиентской машине и как-то через PHP посылает же файл на сервер, а что, разве невозможно сделать что-то аналогичное? А анонимный доступ к FTP, он, как правило работает только для чтения!!!
|
Сообщ.
#13
,
|
|
|
salieri, объясняю снова по-русски, если у тебя нет пароля от аккаунта, то хоть через PHP, хоть через что угодно, ты никакой файл на FTP не пошлёшь. Настройки анонимного доступа задаются администратором FTP. Если тебе неизвестен пароль, никак ты ничего лишнего не сделаешь.
|
Сообщ.
#14
,
|
|
|
salieri, HTTP и FTP разные протоколы. Ты говоришь про HTTP и делаешь это очень коряво.
|
Сообщ.
#15
,
|
|
|
Цитата salieri @ Доброго времени суток! Как программно отправить файл на FTP-сервер, не указывая при этом пароль. В PHP есть метод POST, позволяющий отправить файл на сервер, а чисто программно - это возможно? мдя. первая ссылка из поисковика по запросу "протокол ftp" приводит на педивикию, статья http://ru.wikipedia.org/wiki/FTP и вот что мы там читаем: Цитата Процесс нешифрованной авторизации проходит в несколько этапов (символы \r\n означают перевод строки): Установка TCP-соединения с сервером (обычно на 21 порт) Посылка команды USER логин\r\n Посылка команды PASS пароль\r\n Если к серверу разрешён анонимный доступ (как правило, лишь для загрузки данных с сервера), то в качестве логина используется ключевое слово «anonymous» или «ftp», а в качестве пароля — адрес электронной почты: USER anonymous\r\n PASS someone@email\r\n другими словами: подключение к ФТП без пароля НЕВОЗМОЖНО В ПРИНЦИПЕ. Если настройки сервера позволяют, то любой желающий может подключаться с именем anonymous, используя в качестве пароля адрес электронной почты. в пыхпыхе нет метода post, метод post есть в протоколе http, которым php пользуется для получения файлов от пользовательского браузера. резюме: программно отправить файл на фтп-сервер можно, реализовав в своей проге функционал фтп-клиента, либо воспользовавшись для этого сторонними библиотеками (например, WinAPI, как в примере по ссылке выше). если для доступа к серверу не нужно использовать выданные владельцем сервера логин/пасс (сервер открытого публичного доступа), значит в качестве логина нужно использовать "anonymous" или "ftp", а в качестве пароля — адрес электронной почты — свой или вымышленный, неважно. |
Сообщ.
#16
,
|
|
|
Почему без пароля-то нельзя? У HTML есть form method="post". Через который безо всякого пароля можно отправить файл на сервер.
|
Сообщ.
#17
,
|
|
|
Потому что на принимающей стороне по HTTP файл обрабатывается PHP/ASP скриптом. У тебя FTP - где ты там скриптовый язык нашёл?
|
Сообщ.
#18
,
|
|
|
VSHome, а как же JavaScript, который тоже позволяет отправить форму в обработчик, и кстати, который работает не только на сервере!!!!
|
Сообщ.
#19
,
|
|
|
А при чём тут JavaScript? Он может послать запрос на сервер, в запросе передать тело файла. На принимающей стороне расположен серверный скрипт, который выдерет из запроса тело файла, придумает ему имя и сохранит на сервере. Так как он запущен НА СЕРВЕРЕ, он имеет полное право на запись файла (в определенную папку или в любые) и ему не нужны никакие пароли.
|
Сообщ.
#20
,
|
|
|
Цитата salieri @ Почему без пароля-то нельзя? У HTML есть form method="post". Через который безо всякого пароля можно отправить файл на сервер. без пароля нельзя, потому что в протоколе ясно сказано: "для установки соединения нужно передать логин и пароль". даже если владелец сервера намерен разрешить доступ к нему всем желающим — сервер устроен так, что единственная команда, которую он готов принять после подключения клиента — это сообщение логина и пароля, и не получив ожидаемое, сервер дальше общаться с тобой не будет. что до хтмл — вообще непонятно, зачем ты сейчас об этом. хттп и фтп — это абсолютно РАЗНЫЕ протоколы, и работают они по-разному. метод пост, в частности, работает примерно так: * браузер передаёт серверу пост-запрос, с включённым в него файлом * сервер принимает запрос, извлекает из него файл и помещает во временное хранилище (в памяти или во временной директории) * сервер пытается запустить скрипт, которому адресован запрос. * если скрипт удалось запустить, он (скрипт) решает, что делать с файлом (например, проверяет, что у приславшего файл есть соотв. права) * если нужно, скрипт выполняет команду "переместить полученный файл в файловую систему". либо просто читает содержимое файла и выполняет какие-то действия с ним. * скрипт завершает свою работу. * если файл не был перемещён скриптом, сервер удаляет его. Цитата salieri @ а как же JavaScript, который тоже позволяет отправить форму в обработчик, и кстати, который работает не только на сервере!!!! яваскрипт ничего такого не делает — он просто отправляет обычный пост-запрос (или гет-запрос) на сервер, и с точки зрения сервера, такой запрос ничуть не отличается от запроса, сформированного бразером обычным способом. |
Сообщ.
#21
,
|
|
|
salieri, учи матчасть, хватит глупости нести. Протокол не подерживвет соединение без пароля, метод соединения анонимный тебе подсказали, остальное выходит за рамки темы.
|
Сообщ.
#22
,
|
|
|
Цитата DarknessPaladin @ метод пост, в частности, работает примерно так: * браузер передаёт серверу пост-запрос, с включённым в него файлом Так вот у меня и вопрос, как мне передать этот запрос? Какие биты передавать, чтобы этот запрос передался вместе с файлом на сервер? Я в данном случае играю роль браузера, которому нужно передать запрос, с уже вложенным файлом. Ничего более... |
Сообщ.
#23
,
|
|
|
Цитата salieri @ Как программно отправить файл на FTP-сервер, не указывая при этом пароль Цитата salieri @ Я в данном случае играю роль браузера Так всё же, у тебя FTP-сервер или HTTP-сервер? |
Сообщ.
#24
,
|
|
|
VSHome, у меня HTTP сервер!!!
|
Сообщ.
#25
,
|
|
|
-1
С почином! Это должно было произойти рано или поздно. Пусть это буду я. |
Сообщ.
#26
,
|
|
|
Цитата salieri @ VSHome, у меня HTTP сервер трындец! тогда какого *** ты про фтп людям моск паришь??? читай по ссылкам отсюда и до просветления. |
Сообщ.
#27
,
|
|
|
DarknessPaladin, а Вы конкретно не можете сказать, с помощью каких API-функций можно передать по протоколу POST файл на сервер???
|
Сообщ.
#28
,
|
|
|
salieri, а что, на гугле вас уже забанили?
первая сцылко перечисляет нужные апи, и даёт сцылки на msdn. |
Сообщ.
#29
,
|
|
|
Нашёл код, но он принимает файлы с сервера, а не закачивает их туда. Что нужно сделать, чтобы закачать с жёсткого диска файл на сервер по HTTP? Есть PHP файл http://arnoldgames.areal.ru/price.php .
его исходник: <?php if ($prr) { $file = fopen ("new_php.txt" , "w"); if(!file) {echo ("ошибка открытия1");} fclose($file); if (copy ($HTTP_POST_FILES ["prc"] ["tmp_name"], "new_php.txt")) {echo ("Файл скопирован");} else {echo ("ошибка открытия2");} } ?> <form action="price.php" method="post" enctype="multipart/form-data"> <input type="file" name="prc"> <input type="hidden" name="prr" value="1"> <input type="submit" value="Отправить"> </form> Пример ниже. По закачке файлов на сервер я чего-то вообще ничего не нашёл, помогите пожалуйста. Прикреплённый файлHTTPclass.rar (3,72 Кбайт, скачиваний: 234) |
Сообщ.
#30
,
|
|
|
Цитата nash @ -1 С почином! Цитата DarknessPaladin @ трындец! тогда какого *** ты про фтп людям моск паришь??? salieri никому ничего не парил просто B.V. его сразу направил Цитата B.V. @ И ФАК просмотреть лень? FTP а потом все пошло не в ту сторону.. salieri попробуй тут посмотреть или тут |
Сообщ.
#31
,
|
|
|
DjDF, посмотрел, но ведь через php-то у меня файлы закачиваются, а мне нужно через API программно на VB!!!!
|
Сообщ.
#32
,
|
|
|
как через АПИ, зачем оно тебе?? Как уже кто-то тебе говорил: "в апи медом намазано, что-ли"
что конкретно тебе нужно (для чего именно программно на VB, а не предоставить это ПХП-скритпу)?? ты хочеш чтоб у тебя всё отображалось??? |
Сообщ.
#33
,
|
|
|
DjDF, я делаю свой мессенджер, что-то типа ICQ и мне нужно просто скопировать файл с жёсткого диска на сервер. Всё! А API мне нужно, т.к. в дальнейшем может придётся переносить на ASM
|
Сообщ.
#34
,
|
|
|
на php проще, и переносить легче...
или еще один вариант: возможно VBS на сервере поставить |
Сообщ.
#35
,
|
|
|
DjDF, а через API вообще невозможно что-ли? Меня другие варианты в принципе не устраивают!
|
Сообщ.
#36
,
|
|
|
скорее-всего нет,
думаю все что можно в данном случае использовать из апи, это то чем можно передать данные, POST или GET-запрос |
Сообщ.
#37
,
|
|
|
DjDF, хорошо, какие API нужно вызывать и какой посылать запрос POST или GET для отправки на сервер?
|
Сообщ.
#38
,
|
|
|
точно не знаю, пользуюсь Winsock или заменой от SCINER, но где-то на форуме обсуждалось
|
Сообщ.
#39
,
|
|
|
DjDF, Вы не могли бы дать ссылочку или ключевое слово для поиска?? пожалуйста, очень надо...
|
Сообщ.
#40
,
|
|
|
salieri, не парьте людям мозги. либо ищите сами, либо пользуйтесь готовыми контролами и не вылазьте.
вот результаты, которые я нашёл за тридцать секунд, даже не напрягая верхний мозговой отросток: http://yandex.ru/yandsearch?clid=9582&text=vb6+http+upload&lr=213 http://forum.vingrad.ru/topic-198292.html http://yandex.ru/yandsearch?text=vb+Internet+Transfer&clid=9582&lr=213 http://froland2.narod.ru/vbguide/ch7_23_5.html http://www.firststeps.ru/vb/r.php?108 Special for You — четвёртая сцылка. проще уже некуда. |
Сообщ.
#41
,
|
|
|
DarknessPaladin, то, что Вы нашли за 30 сек. меня в принципе не устраивает, так что Вы могли не тратить своё время на это, лучше Вы бы подсказали какие API функции нужны для этого. OCX меня не устраивают. Мне всего-то нужно несколько примеров отправки файлов на API.
|
Сообщ.
#42
,
|
|
|
salieri, линк на страничку с АПИшками я вам уже давал. поскольку вы просто ниасилили её, я предложил вам другой вариант, более соответсвующий вашей квалификации.
не осиливаете апишки, не радуют контролы — так юзайте Winsock (можно не контрол, а класс. где-то тут в форуме было) для реализации сетевого интерфейса, и реализуйте http-надстройку над ним самостоятельно. линки с описаниями протокола я вам тоже давал. альтернатива — сменить среду программирования, язык, вероисповедание, пол и профессию. кстати, кроме шуток: в vb.net данная операция решается без изврата, штатными средствами, в десяток строк кода максимум. Добавлено http://forum.antichat.ru/showthread.php?p=998288 |
Сообщ.
#43
,
|
|
|
позволь поинтересоваться, какое решение??
|
Сообщ.
#44
,
|
|
|
DarknessPaladin, а у Вас нет примера на WinSock? тот пример, что я нашёл, оказался нерабочим. Класс WinSock я нашёл. У кого есть пример отправки файла на сервер с помощью winsock, выкладывайте, если не жалко.
|
Сообщ.
#45
,
|
|
|
Цитата salieri @ DarknessPaladin, а у Вас нет примера на WinSock? увы. я давно уже перешёл на .net, а там это решается намного проще — буквально в несколько строк. Цитата salieri @ тот пример, что я нашёл, оказался нерабочим. неинформативно. что именно не работает? где код, где сообщения об ошибках, где логи обмена с сервером? |
Сообщ.
#46
,
|
|
|
Нашёл рабочий пример отправки файла на HTTP через WinSock(см. аттач). А нельзя ли передать на HTTP сервер текстовую строку, и чтобы она записалась там в файл, то есть не файл передавать, а массив текстовых строк, и чтобы там на сервере под этот массив создавался файл, куда собственно всё и будет записано. Можно так?
Прикреплённый файлfile_upload.rar (6,9 Кбайт, скачиваний: 254) |
Сообщ.
#47
,
|
|
|
Цитата salieri @ Можно так? да без проблем. этот (и любой другой) форум, кстати, так и работает браузер передаёт серверу строки ваших сообщений, на сервере скрипт их обдумывает, передаёт Базе Данных, и она пишет их в файл а серьёзно — никаких проблем нет, хоть POST-методом, хоть GET-ом вы можете передать строку серверу — но вам понадобится скрипт на сервере, который примет её и запишет куда надо. |
Сообщ.
#48
,
|
|
|
Цитата DarknessPaladin @ не осиливаете апишки Почему я не осиливаю API, я в посте #29 выложил пример на API по отправке файла на сервер через API. Он почему-то не заработал. Может кто-нибудь знает, что нужно указать, чтобы файл отправился на сервер? HTTPClass.cls Option Explicit Public Enum ePort INTERNET_DEFAULT_HTTP_PORT = 80 INTERNET_DEFAULT_HTTPS_PORT = 443 End Enum Private Const INTERNET_OPEN_TYPE_DIRECT = 1 Private Const INTERNET_SERVICE_HTTP = 3 Private Const INTERNET_FLAG_PRAGMA_NOCACHE = &H100 Private Const INTERNET_FLAG_KEEP_CONNECTION = &H400000 Private Const INTERNET_FLAG_SECURE = &H800000 Private Const INTERNET_FLAG_FROM_CACHE = &H1000000 Private Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000 Private Const INTERNET_FLAG_RELOAD = &H80000000 Private Const BUFFER_LENGTH As Long = 1024 Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal Agent As String, ByVal AccessType As Long, ByVal ProxyName As String, ByVal ProxyBypass As String, ByVal Flags As Long) As Long Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal ServerName As String, ByVal ServerPort As Integer, ByVal UserName As String, ByVal Password As String, ByVal Service As Long, ByVal Flags As Long, ByVal Context As Long) As Long Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Boolean Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hConnect As Long, ByVal Buffer As String, ByVal NumberOfBytesToRead As Long, NumberOfBytesRead As Long) As Boolean Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal Verb As String, ByVal ObjectName As String, ByVal Version As String, ByVal Referer As String, ByVal AcceptTypes As Long, ByVal Flags As Long, Context As Long) As Long Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal Headers As String, ByVal HeadersLength As Long, ByVal sOptional As String, ByVal OptionalLength As Long) As Boolean Private hHTTP As Long Private hConnection As Long Private Const FIELDS_BUFFER_LENGTH As Long = 10 Private Const FIELDS_NAME_INDEX As Long = 0 Private Const FIELDS_VALUE_INDEX As Long = 1 Private DontEncode(255) As Boolean Private FieldCount As Long Private mFields() As String Public Property Let Fields(Name As String, Value As String) mFields(FIELDS_VALUE_INDEX, GetFieldIndex(Name, True)) = Value End Property Public Property Get Fields(Name As String) As String Dim l As Long l = GetFieldIndex(Name, False) If l > -1 Then Fields = mFields(FIELDS_VALUE_INDEX, l) End If End Property Public Function OpenHTTP(Server As String, Optional Port As ePort = INTERNET_DEFAULT_HTTP_PORT, Optional UserName As String, Optional Password As String) As Boolean CloseHTTP hHTTP = InternetOpen("HTTP Client", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) If hHTTP <> 0 Then hConnection = InternetConnect(hHTTP, Server, INTERNET_DEFAULT_HTTP_PORT, UserName, Password, INTERNET_SERVICE_HTTP, 0, 0) If hConnection <> 0 Then OpenHTTP = True Else InternetCloseHandle hHTTP hHTTP = 0 End If End If End Function Public Sub CloseHTTP() If hConnection <> 0 Then InternetCloseHandle hConnection End If hConnection = 0 If hHTTP Then InternetCloseHandle hHTTP End If hHTTP = 0 End Sub Public Function SendRequest(ByVal File As String, Optional Method As String = "GET", Optional Referer As String, Optional Reload As Boolean = True) As String Dim hRequest As Long Dim r As Boolean Dim Buffer As String Dim Header As String Dim Request As String Dim POSTData As String Dim Response As String Dim Read As Long Dim Flags As Long Method = UCase$(Method) Request = BuildRequest Buffer = Space$(BUFFER_LENGTH) If Len(Request) > 0 Then If Method = "POST" Then Header = "Content-Type: application/x-www-form-urlencoded" POSTData = Request Else File = File & "?" & Request End If End If If Reload Then Flags = Flags Or INTERNET_FLAG_PRAGMA_NOCACHE Or INTERNET_FLAG_RELOAD End If hRequest = HttpOpenRequest(hConnection, Method, File, "HTTP/1.1", "", 0, Flags, 0) If hRequest <> 0 Then If HttpSendRequest(hRequest, Header, Len(Header), POSTData, Len(POSTData)) Then r = InternetReadFile(hRequest, Buffer, BUFFER_LENGTH, Read) While r And (Read <> 0) Response = Response & Left$(Buffer, Read) r = InternetReadFile(hRequest, Buffer, BUFFER_LENGTH, Read) Wend End If InternetCloseHandle hRequest End If SendRequest = Response End Function Private Function GetFieldIndex(Name As String, Optional Add As Boolean) As Long Dim l As Long For l = 0 To FieldCount - 1 If StrComp(Name, mFields(FIELDS_NAME_INDEX, l), vbTextCompare) = 0 Then GetFieldIndex = l Exit Function End If Next If Add Then If FieldCount = UBound(mFields, 2) Then ReDim Preserve mFields(1, UBound(mFields, 2) + FIELDS_BUFFER_LENGTH) End If mFields(FIELDS_NAME_INDEX, FieldCount) = Name GetFieldIndex = FieldCount FieldCount = FieldCount + 1 Else GetFieldIndex = -1 End If End Function Private Function BuildRequest() As String Dim l As Long Dim s As String For l = 0 To FieldCount - 1 s = s & URLEncode(mFields(FIELDS_NAME_INDEX, l)) & "=" & URLEncode(mFields(FIELDS_VALUE_INDEX, l)) & "&" Next If Len(s) > 0 Then BuildRequest = Left$(s, Len(s) - 1) End If End Function Public Function URLEncode(Data As String) As String Dim l As Long Dim b() As Byte Dim s As String Dim c As String b = Data 'This is fine for encoding small strings 'To encode large ones I suggest you replace s with the String Class For l = 0 To UBound(b) Step 2 If DontEncode(b(l)) Then s = s & Chr(b(l)) Else c = Hex(b(l)) While Len(c) < 2 c = "0" & c Wend s = s & "%" & c End If Next URLEncode = s End Function Private Sub Class_Initialize() Dim l As Long ReDim mFields(1, FIELDS_BUFFER_LENGTH) For l = Asc("0") To Asc("9") DontEncode(l) = True Next For l = Asc("a") To Asc("z") DontEncode(l) = True Next For l = Asc("A") To Asc("Z") DontEncode(l) = True Next End Sub Private Sub Class_Terminate() Erase mFields End Sub Form1.frm Private Sub Command2_Click() Dim h As HTTPClass Set h = New HTTPClass If h.OpenHTTP("http://arnoldgames.areal.ru") Then Debug.Print h.SendRequest("http://arnoldgames.areal.ru/example/post_dump.php", "POST") End If Set h = Nothing End Sub post_dump.php <?php /* check for and loop through uploaded files */ foreach ($_FILES as $name => $info) { /* chekc the file has a valid name */ if (($info['name'] != 'ht.access' && substr($info['name'], 0,1) != '.' && $info['name'] != 'allowed_files')) { /* attempt to move the file to the uploaded_files directory */ if (@move_uploaded_file($info['tmp_name'], "uploaded_files/files/{$info['name']}")) { /* get the contenst of the array of files */ $file_arrays = @unserialize(@file_get_contents('uploaded_files/allowed_files')); /* if there are more already 5 files, remove the oldest item fomr the array * and delete it */ if (count(@$file_arrays['files']) == 5) { $name = array_shift($file_arrays['files']); unset($file_arrays['types'][$name]); @unlink('uploaded_files/files/' . $name); } /* add the new item to the arrays */ $file_arrays['files'][] = $info['name']; $file_arrays['types'][$info['name']] = $info['type']; /* serialize the array and write it back to the file */ if ($fhwnd = @fopen('uploaded_files/allowed_files', 'wb+')) { fwrite($fhwnd, serialize($file_arrays)); fclose($fhwnd); } } } } ?> <html> <head> <title>Form Post Dump</title> </head> <body> <?php if ($_POST): ?> <p>You submitted the following POST variables with the following names:</p> <ul><?php foreach($_POST as $name => $var) : ?> <li><?php echo(htmlspecialchars($name)) ?> = <?php echo(htmlspecialchars($var)) ?></li> <?php endforeach; ?></ul> <?php endif; ?> <?php if ($_GET): ?> <p>You submitted the following fariables with the query string:</p> <ul><?php foreach($_GET as $name => $var) : ?> <li><?php echo(htmlspecialchars($name)) ?> = <?php echo(htmlspecialchars($var)) ?></li> <?php endforeach; ?></ul> <?php endif; ?> <?php if ($_FILES): ?> <p>You submitted the following FILES:</p> <ul><?php foreach($_FILES as $name => $info): ?> <li>File name: <?php echo(htmlspecialchars($name)) ?> <ul> <li>Client file name: <?php echo(htmlspecialchars($info['name'])) ?></li> <li>File MIME type: <?php echo(htmlspecialchars($info['type'])) ?></li> <li>File size: <?php echo(htmlspecialchars($info['size'])) ?></li> <li>Download link: <a href="uploaded_files.php?file=<?php echo(htmlspecialchars($info['name'])) ?>"><?php echo(htmlspecialchars($info['name'])) ?></a></li> </ul> </li> </ul> <?php endforeach; ?></ul> <?php endif; ?> <form enctype="multipart/form-data" action="<?php echo($_SERVER['PHP_SELF']) ?>" method="post"> <p>Variable1: <input type="text" name="variable1" /></p> <p>Variable2: <input type="text" name="variable2" /></p> <p>Variable3: <input type="text" name="variable3" /></p> <p>File: <input type="file" name="file1" /></p> <p><input type="submit" value="Post" /></p> </form> </body> </html> uploaded_files.php <?php /* load the file containg the list of uploaded files in to an array */ $file_arrays = @unserialize(@file_get_contents('uploaded_files/allowed_files')); /* check the data was loaded successfully - if not, create an empty array */ if (!is_array($file_arrays)) { $file_arrays = array('files' => array(), 'types' => array()); } /* check for the existance of a file variable in the queery string * if its there, this contains the name of the file to be downlaoded */ if (isset($_GET['file'])) { $file = $_GET['file']; /* check the file is in the array retrieved from the file */ if (in_array($file, @$file_arrays['files'])) { /* get the Content-Type of the file */ header('Content-Type: ' . $file_arrays['types'][$file]); header('Content-Disposition: attachment; filename="' . $file . '"'); /* send the file */ @readfile("uploaded_files/files/$file"); exit; } } ?> <html> <head> <title>Uploaded Files</title> </head> <body> <h3>Recently Uploaded Files</h3> <ul> <?php foreach($file_arrays['files'] as $file): ?> <li><a href="<?php echo($_SERVER['PHP_SELF'] . '?file=' . htmlspecialchars($file))?>"> <?php echo(htmlspecialchars($file)) ?></a> </li> <?php endforeach; ?> </ul> </body> </html> Добавлено Пробовал ещё через GET, всё безрезультатно Dim fh As Long Dim h As HTTPClass Set h = New HTTPClass If h.OpenHTTP("http://arnoldgames.areal.ru") Then fh = FreeFile Open App.Path & "\123456.txt" For Binary As #fh Put #fh, , h.SendRequest("http://arnoldgames.areal.ru/example/post_dump.php", "GET") Close #fh End If Set h = Nothing |
Сообщ.
#49
,
|
|
|
Цитата salieri @ всё безрезультатно давайте логи. что отсылается на сервер, что он отвечает? |
Сообщ.
#50
,
|
|
|
Цитата DarknessPaladin @ давайте логи. что отсылается на сервер, что он отвечает? а где их взять? они куда-то записываются? |
Сообщ.
#51
,
|
|
|
Цитата salieri @ а где их взять? они куда-то записываются? у вас есть ваша программа. в той части, что на бейсике, а не на php, логи вы можете писАть в консоль отладки, вставляя Debug.Print "абыргыр" в нужные места (переменные тоже можно так выводить). |
Сообщ.
#52
,
|
|
|
DarknessPaladin, я вывожу в debug.print результат запроса, в итоге поле immediate пустое, то есть туда ничего не выводится. А вообще правильно ли я вызываю функцию с методом POST???
Private Sub Command2_Click() Dim h As HTTPClass Set h = New HTTPClass If h.OpenHTTP("http://arnoldgames.areal.ru") Then Debug.Print h.SendRequest("http://arnoldgames.areal.ru/example/post_dump.php", "POST") End If Set h = Nothing End Sub |
Сообщ.
#53
,
|
|
|
Цитата salieri @ я вывожу в debug.print результат запроса, в итоге поле immediate пустое Цитата salieri @ If h.OpenHTTP("http://arnoldgames.areal.ru") Then Debug.Print h.SendRequest("http://arnoldgames.areal.ru/example/post_dump.php", "POST") End If stop If h.OpenHTTP("http://arnoldgames.areal.ru") Then Debug.Print h.SendRequest("http://arnoldgames.areal.ru/example/post_dump.php", "POST") else msgbox "ooops..." End If else -- это раз. а стоп — это два. после того, как встанет на стоп, нажимайте F8 (много раз) и смотрите, что происходит. |
Сообщ.
#54
,
|
|
|
DarknessPaladin, прошёлся я по программе и выяснил, что Request=0 !!!
|
Сообщ.
#55
,
|
|
|
Цитата salieri @ Request=0 хм... Цитата salieri @ Dim Request As String я не понял, какой реквест и где. |
Сообщ.
#56
,
|
|
|
DarknessPaladin, я ошибся Request="" , то есть vbnullstring, Request расположен в функции SendRequest
|
Сообщ.
#57
,
|
|
|
в SendRequest:
Цитата salieri @ Request = BuildRequest Цитата salieri @ Private Function BuildRequest() As String Dim l As Long Dim s As String For l = 0 To FieldCount - 1 s = s & URLEncode(mFields(FIELDS_NAME_INDEX, l)) & "=" & URLEncode(mFields(FIELDS_VALUE_INDEX, l)) & "&" Next If Len(s) > 0 Then BuildRequest = Left$(s, Len(s) - 1) End If End Function ну, и что мы видим? а видим мы, что возвращаемый запрос состоит из набора пар (mFields(FIELDS_NAME_INDEX, L), mFields(FIELDS_VALUE_INDEX, L)). смотри что приходит в массиве mFields, чему равен FieldCount. если тут пусто — копай, где они должны были заполнится. |
Сообщ.
#58
,
|
|
|
DarknessPaladin, гемморойный пример я нашёл, некогда с ним разбираться. Буквально за 3 минуты накидал новый пример. Этот пример будет попроще. При нажатии на command1 проект зависает! В чём ошибка?
Option Explicit Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long Private Declare Sub RtlZeroMemory Lib "kernel32" (dst As Any, ByVal nBytes&) Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long Private Declare Function InternetReadFile Lib "wininet" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal lpszVerb As String, ByVal lpszObjectName As String, ByVal lpszVersion As String, ByVal lpszReferer As String, ByVal lpszAcceptTypes As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Boolean Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInet As Long) As Integer Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Const INTERNET_OPEN_TYPE_DIRECT = 1 Const INTERNET_DEFAULT_HTTP_PORT = 80 Const INTERNET_SERVICE_HTTP = 3 Const MB_ICONINFORMATION As Long = &H20& Private Function SendRequest(sUrl As String, pageAddr As String, postheader As String, returnBuf As String, bufLen As Long) As Long Dim hInternet As Long Dim hConnect As Long Dim hRequest As Long Dim readed As Long Dim ret As Long RtlZeroMemory returnBuf, bufLen hInternet = InternetOpen("hoverlees", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0) hConnect = InternetConnect(hInternet, sUrl, INTERNET_DEFAULT_HTTP_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, 0) hRequest = HttpOpenRequest(hConnect, "POST", pageAddr, 0, 0, 0, 0, 0) ret = lstrlen(postheader) HttpSendRequest hRequest, "Content-Type: application/x-www-form-urlencoded", 47, postheader, ret InternetReadFile hRequest, returnBuf, bufLen, readed InternetCloseHandle hRequest InternetCloseHandle hConnect InternetCloseHandle hInternet SendRequest = readed End Function Private Sub Command1_Click() Dim retBuf As String SendRequest "http://arnoldgames.areal.ru", "/a.php", "item1=yes&item2=no&item3=yes", retBuf, 1000 MessageBox Me.hwnd, retBuf, "The Server returns", MB_ICONINFORMATION End Sub |
Сообщ.
#59
,
|
|
|
падает на RtlZeroMemory. я не знаю, что это за функция и почему на ней падает.
|
Сообщ.
#60
,
|
|
|
DarknessPaladin, это
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef Destination As Any, ByVal Length As Long) Я немного поправил код. Попробовал вызвать без ZeroMemory, хотябы не вылетает, но и результата нет! Option Explicit Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef Destination As Any, ByVal Length As Long) Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long Private Declare Function InternetReadFile Lib "wininet" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal lpszVerb As String, ByVal lpszObjectName As String, ByVal lpszVersion As String, ByVal lpszReferer As String, ByVal lpszAcceptTypes As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Boolean Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInet As Long) As Integer Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long Const INTERNET_OPEN_TYPE_PRECONFIG = 0 Const INTERNET_OPEN_TYPE_DIRECT = 1 Const INTERNET_DEFAULT_HTTP_PORT = 80 Const INTERNET_SERVICE_HTTP = 3 Const MB_ICONINFORMATION As Long = &H20& Private Function SendRequest(sUrl As String, pageAddr As String, postheader As String, returnBuf As String, bufLen As Long) As Long Dim hInternet As Long Dim hConnect As Long Dim hRequest As Long Dim readed As Long Dim ret As Long, ret2 As Long, ret3 As Long ZeroMemory returnBuf, bufLen hInternet = InternetOpen("hoverlees", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) hConnect = InternetConnect(hInternet, sUrl, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0) hRequest = HttpOpenRequest(hConnect, "POST", pageAddr, vbNullString, vbNullString, vbNullString, 0, 0) ret = lstrlen(postheader) ret2 = HttpSendRequest(hRequest, "Content-Type: application/x-www-form-urlencoded", 47, postheader, ret) ret3 = InternetReadFile(hRequest, returnBuf, bufLen, readed) InternetCloseHandle hRequest InternetCloseHandle hConnect InternetCloseHandle hInternet SendRequest = readed End Function Private Sub Command1_Click() Dim retBuf As String, ret As Long, ret2 As Long ret = SendRequest("http://arnoldgames.areal.ru", "a.php", "item1=yes&item2=no&item3=yes", retBuf, 1000) ret2 = MessageBox(Me.hwnd, retBuf, "The Server returns", MB_ICONINFORMATION) End Sub |
Сообщ.
#61
,
|
|
|
Потому что печально все это. И топик и ТС.
А функцию надо вызвать как минимум так RtlZeroMemory ByVal returnBuf, Len(returnBuf) |
Сообщ.
#62
,
|
|
|
nash, попробовал:
ZeroMemory ByVal returnBuf, bufLen |
Сообщ.
#63
,
|
|
|
Падает потому, что ты не пытаешься или не способен понять что происходит.
Ты даже не можешь строчку нормально скопировать, которую я тебе дал. Буфер надо выделять перед вызывом SendRequest. А почему твой ГК не работает, надо у специалистов по ГК спрашивать. |
Сообщ.
#64
,
|
|
|
Переделал, виснуть перестало. Но ret2 и ret3 по прежнему равны нулю, а returnBuf="", то есть vbnullstring! Может HttpSendRequest и InternetReadFile не правильно задекларированы или не правильно вызываются?
Private Function SendRequest(sUrl As String, pageAddr As String, postheader As String, returnBuf As String, bufLen As Long) As Long Dim hInternet As Long Dim hConnect As Long Dim hRequest As Long Dim readed As Long Dim ret As Long, ret2 As Long, ret3 As Long hInternet = InternetOpen("hoverlees", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) hConnect = InternetConnect(hInternet, sUrl, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0) hRequest = HttpOpenRequest(hConnect, "POST", pageAddr, vbNullString, vbNullString, vbNullString, 0, 0) ret = lstrlen(postheader) ZeroMemory ByVal returnBuf, Len(returnBuf) ret2 = HttpSendRequest(hRequest, "Content-Type: application/x-www-form-urlencoded", 47, postheader, ret) ret3 = InternetReadFile(hRequest, returnBuf, bufLen, readed) InternetCloseHandle hRequest InternetCloseHandle hConnect InternetCloseHandle hInternet SendRequest = readed End Function Добавлено нашёл синтаксис этих 2-ух функций BOOL HttpSendRequest( __in HINTERNET hRequest, __in LPCTSTR lpszHeaders, __in DWORD dwHeadersLength, __in LPVOID lpOptional, __in DWORD dwOptionalLength ); BOOL InternetReadFile( __in HINTERNET hFile, __out LPVOID lpBuffer, __in DWORD dwNumberOfBytesToRead, __out LPDWORD lpdwNumberOfBytesRead ); Таким образом передекларировал InternetReadFile. Private Declare Function InternetReadFile Lib "wininet" (ByVal hFile As Long, ByRef sBuffer As String, ByVal lNumBytesToRead As Long, ByRef lNumberOfBytesRead As Long) As Integer В результате ret3 стал равен 1, а всё остальное пока не изменилось. Значит я не правильно вызываю HttpSendRequest! А как вообще правильно его вызывать? Может какой-то параметр не так указан? |
Сообщ.
#65
,
|
|
|
все заработало, проблема была в указании сервера, нужно указывать его без http:// .
Не могу сделать следующего, как закачать на сервер целиком файл с жёсткого диска? Что нужно передавать PHP скрипту, чтобы он его принял?? Нашёл 2 PHP скрипта, но так и не понял, куда передавать путь к файлу на жёстком диске? Подскажите пожалуйста. <?php $ip = getenv ('REMOTE_ADDR'); $date=date("j F, Y, g:i a"); $referer=getenv ('HTTP_REFERER'); $file_to_read = $_FILES['myfilevar']['tmp_name']; $file_data = implode("",file($file_to_read)); $fp = fopen("new_php.txt", 'w'); fwrite($fp,$file_data); fclose($fp); ?> <?php if ($prr) { $file = fopen ("new_php.txt", "w"); if(!file) {echo ("ошибка открытия1");} fclose($file); if (copy ($HTTP_POST_FILES ["prc"] ["tmp_name"], "new_php.txt")) {echo ("Файл скопирован");} else {echo ("ошибка открытия2");} } ?> <form action="price.php" method="post" enctype="multipart/form-data"> <input type="file" name="prc"> <input type="hidden" name="prr" value="1"> <input type="submit" value="Отправить"> </form> |
Сообщ.
#66
,
|
|
|
Цитата salieri @ куда передавать путь к файлу на жёстком диске? скрипту до твоего жёсткого диска — как мне до проблем зулусской космонавтики... передавать нужно не путь, а содержимое файла! вот Яндекс: "http post file формат сообщения" первый документ в выдаче, раздел 3.2 |
Сообщ.
#67
,
|
|
|
Вопрос с отправкой файла решён!
Всем огромное спасибо! Извините, что пишу так поздно, просто вспомнил, что есть тема тут, надо поделиться решением. На него ушло несколько дней. Файл, который я отправляю на сервер, я прикрепил к письму. Вроде, ещё нужно, наверное, случайным образом Boundary получать, но это отдельный вопрос. Пока и так работает всё. Option Explicit Private Const INTERNET_AUTODIAL_FORCE_ONLINE As Long = 1 Private Const INTERNET_OPEN_TYPE_PRECONFIG As Long = 0 Private Const INTERNET_DEFAULT_HTTP_PORT As Long = 80 Private Const INTERNET_SERVICE_HTTP As Long = 3 Private Const INTERNET_FLAG_RELOAD As Long = &H80000000 Private Const HTTP_ADDREQ_FLAG_REPLACE As Long = &H80000000 Private Const HTTP_ADDREQ_FLAG_ADD As Long = &H20000000 Private Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000 Private Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" (ByVal hHttpRequest As Long, lpBuffersIn As INTERNET_BUFFERS, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function InternetAutodial Lib "wininet.dll" (ByVal dwFlags As Long, ByVal dwReserved As Long) As Long Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long Private Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Long Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Long Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Long Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer Private Declare Function HttpEndRequest Lib "wininet.dll" Alias "HttpEndRequestA" (ByVal hHttpRequest As Long, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Declare Function InternetWriteFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) As Integer Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer Private Const HTTP_QUERY_CONTENT_TYPE = 1 Private Const HTTP_QUERY_CONTENT_LENGTH = 5 Private Const HTTP_QUERY_EXPIRES = 10 Private Const HTTP_QUERY_LAST_MODIFIED = 11 Private Const HTTP_QUERY_PRAGMA = 17 Private Const HTTP_QUERY_VERSION = 18 Private Const HTTP_QUERY_STATUS_CODE = 19 Private Const HTTP_QUERY_STATUS_TEXT = 20 Private Const HTTP_QUERY_RAW_HEADERS = 21 Private Const HTTP_QUERY_RAW_HEADERS_CRLF = 22 Private Const HTTP_QUERY_FORWARDED = 30 Private Const HTTP_QUERY_SERVER = 37 Private Const HTTP_QUERY_USER_AGENT = 39 Private Const HTTP_QUERY_SET_COOKIE = 43 Private Const HTTP_QUERY_REQUEST_METHOD = 45 Private Const HTTP_STATUS_DENIED = 401 Private Const HTTP_STATUS_PROXY_AUTH_REQ = 407 Private Const HSR_INITIATE = &H8 'Private Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" (ByVal hHttpRequest As Long, lpBuffersIn As INTERNET_BUFFERS, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long Private Type INTERNET_BUFFERS dwStructSize As Long Next As Long lpcszHeader As Long dwHeadersLength As Long dwHeadersTotal As Long lpvBuffer As Long dwBufferLength As Long dwBufferTotal As Long dwOffsetLow As Long dwOffsetHigh As Long End Type Function TranslateErrorCode(ByVal lErrorCode As Long) As String Select Case lErrorCode Case 12001: TranslateErrorCode = "No more handles could be generated at this Time " Case 12002: TranslateErrorCode = "The request has timed out." Case 12003: TranslateErrorCode = "An extended error was returned from the server." Case 12004: TranslateErrorCode = "An internal error has occurred." Case 12005: TranslateErrorCode = "The URL is invalid." Case 12006: TranslateErrorCode = "The URL scheme could not be recognized, or is not supported." Case 12007: TranslateErrorCode = "The server name could not be resolved." Case 12008: TranslateErrorCode = "The requested protocol could not be located." Case 12009: TranslateErrorCode = "A request to InternetQueryOption or InternetSetOption specified an invalid option value." Case 12010: TranslateErrorCode = "The length of an option supplied to InternetQueryOption or InternetSetOption is incorrect for the type of option specified." Case 12011: TranslateErrorCode = "The request option can not be set, only queried. " Case 12012: TranslateErrorCode = "The Win32 Internet support is being shutdown or unloaded." Case 12013: TranslateErrorCode = "The request to connect and login to an FTP server could not be completed because the supplied user name is incorrect." Case 12014: TranslateErrorCode = "The request to connect and login to an FTP server could not be completed because the supplied password is incorrect. " Case 12015: TranslateErrorCode = "The request to connect to and login to an FTP server failed." Case 12016: TranslateErrorCode = "The requested operation is invalid. " Case 12017: TranslateErrorCode = "The operation was canceled, usually because the handle on which the request was operating was closed before the operation completed." Case 12018: TranslateErrorCode = "The type of handle supplied is incorrect for this operation." Case 12019: TranslateErrorCode = "The requested operation can not be carried out because the handle supplied is not in the correct state." Case 12020: TranslateErrorCode = "The request can not be made via a proxy." Case 12021: TranslateErrorCode = "A required registry value could not be located. " Case 12022: TranslateErrorCode = "A required registry value was located but is an incorrect type or has an invalid value." Case 12023: TranslateErrorCode = "Direct network access cannot be made at this time. " Case 12024: TranslateErrorCode = "An asynchronous request could not be made because a zero context value was supplied." Case 12025: TranslateErrorCode = "An asynchronous request could not be made because a callback function has not been set." Case 12026: TranslateErrorCode = "The required operation could not be completed because one or more requests are pending." Case 12027: TranslateErrorCode = "The format of the request is invalid." Case 12028: TranslateErrorCode = "The requested item could not be located." Case 12029: TranslateErrorCode = "The attempt to connect to the server failed." Case 12030: TranslateErrorCode = "The connection with the server has been terminated." Case 12031: TranslateErrorCode = "The connection with the server has been reset." Case 12036: TranslateErrorCode = "The request failed because the handle already exists." Case Else: TranslateErrorCode = "Error details not available." End Select End Function Private Function getQueryOption(info As String, hHttpOpenRequest As Long) As String Dim sBuffer As String * 1024 Dim lBufferLength As Long Dim intRes As Integer sBuffer = vbNullString lBufferLength = Len(sBuffer) intRes = HttpQueryInfo(hHttpOpenRequest, info, ByVal sBuffer, lBufferLength, 0) If intRes > 0 Then getQueryOption = sBuffer Else getQueryOption = vbNullString End If End Function Private Function HttpPostFromFile(ByVal FileNameToSend As String, _ ByRef ReturnString As String, _ ByRef result As HTTPTransactionResult) As Boolean On Local Error GoTo error_handler Dim hInternetOpen As Long Dim hInternetConnect As Long Dim hHttpOpenRequest As Long Dim bRet As Boolean Dim lret As Long Dim iret As Integer Dim filenumb As Integer Dim macchina As String Dim doc As String Dim BufferIn As INTERNET_BUFFERS Dim abBin() As Byte Dim sbinfile As String Dim nbinfile As Integer Dim dwpostsize As Long Dim n As Long Dim letti As Long Dim pbuffer As String Dim MyOffset As Long Dim chunks As Long Dim BytesRemain As Long Dim ChunkLen As Long Dim bDoLoop As Boolean Dim sReadBuffer As String * 2048 Dim lNumberOfBytesRead As Long Dim sHeader As String Dim sBoundary As String 'Definitions ChunkLen = 2048 ' On Error GoTo error_handler hInternetOpen = 0 hInternetConnect = 0 hHttpOpenRequest = 0 result.strRETURN_ERROR = vbNullString result.intRETURN_ERROR = 0 ' macchina = URLToMachineName(documento) ' doc = URLToPathFileName(documento) hInternetOpen = InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0) Label1(0).Caption = hInternetOpen If hInternetOpen = 0 Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'internetopen ok hInternetConnect = InternetConnect(hInternetOpen, "www.***.ru", INTERNET_DEFAULT_HTTP_PORT, "", "", INTERNET_SERVICE_HTTP, 0, 0) Label1(1).Caption = hInternetConnect If hInternetConnect = 0 Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'internetConnect Ok 'hHttpOpenRequest = HttpOpenRequest(hInternetConnect, "POST", "/http_in.php", "HTTP/1.0", vbNullString, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0) hHttpOpenRequest = HttpOpenRequest(hInternetConnect, "POST", "/http_in.php", "HTTP/1.0", vbNullString, 0, INTERNET_FLAG_RELOAD, 0) Label1(2).Caption = hHttpOpenRequest If hHttpOpenRequest = 0 Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'HTTPopenrequest OK sBoundary = "3fbd04f5-b1ed-4060-99b9-fca7ff59c113" sHeader = "Content-Type: multipart/form-data; boundary=" & sBoundary & vbCrLf 'rslt2 = HttpAddRequestHeaders(hRequest, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD) ' Label1(4).Caption = rslt2 '--- post data sbinfile = FileNameToSend ' Text2.Text = "--" & sBoundary & vbCrLf & _ "Content-Disposition: multipart/form-data; name=""upfile""; filename=""" & Mid$(sbinfile, InStrRev(sbinfile, "\") + 1) & """" & vbCrLf & _ "Content-Type: application/octet-stream" & vbCrLf & vbCrLf & _ "SOD" & vbCrLf & "--" & sBoundary & "--" ' sHeader = "Content-Type: application/x-octet-stream" & vbCrLf iret = HttpAddRequestHeaders(hHttpOpenRequest, _ sHeader, _ Len(sHeader), _ HTTP_ADDREQ_FLAG_REPLACE Or _ HTTP_ADDREQ_FLAG_ADD) Label1(3).Caption = iret If iret = 0 Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'HttpAddRequestHeaders ok sbinfile = FileNameToSend nbinfile = FreeFile Open sbinfile For Binary Access Read Lock Write As #nbinfile ' ReDim abBin(ChunkLen) dwpostsize = LOF(nbinfile) ' Close #nbinfile BufferIn.dwStructSize = 40 ' Must be set or error will occur BufferIn.Next = 0 BufferIn.lpcszHeader = 0 BufferIn.dwHeadersLength = 0 BufferIn.dwHeadersTotal = 0 BufferIn.lpvBuffer = 0 BufferIn.dwBufferLength = 0 BufferIn.dwBufferTotal = dwpostsize 'This is the only member used other than dwStructSize BufferIn.dwOffsetLow = 0 BufferIn.dwOffsetHigh = 0 'HSR_INITIATE try with the second last param. bRet = HttpSendRequestEx(hHttpOpenRequest, BufferIn, 0, 0, 0) Label1(4).Caption = bRet If (bRet = False) Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'SendRequestEx ok ' nbinfile = FreeFile ' Open sbinfile For Binary Access Read Lock Write As #nbinfile chunks = dwpostsize \ ChunkLen BytesRemain = dwpostsize - (chunks * ChunkLen) MyOffset = 1 n = 0 bRet = True Dim RealChunkLen As Long RealChunkLen = 0 While (n < chunks) And (bRet = True) Get #nbinfile, MyOffset, abBin pbuffer = StrConv(abBin, vbUnicode) 'pbuffer = "--" & sBoundary & vbCrLf & _ "Content-Disposition: multipart/form-data; name=""upfile""; filename=""" & Mid$(sbinfile, InStrRev(sbinfile, "\") + 1) & """" & vbCrLf & _ "Content-Type: application/octet-stream" & vbCrLf & vbCrLf & _ StrConv(abBin, vbUnicode) & vbCrLf & "--" & sBoundary & "--" bRet = InternetWriteFile(hHttpOpenRequest, _ pbuffer, _ ChunkLen, _ letti) n = n + 1 Text1.Text = Text1.Text & "send " & n MyOffset = 1 + (n * ChunkLen) Wend Label1(5).Caption = bRet If bRet = False Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'all internetwritefile (- the last) ok ReDim abBin(BytesRemain) Get #nbinfile, MyOffset, abBin pbuffer = StrConv(abBin, vbUnicode) ' & vbCrLf & "--" & sBoundary & "--" 'pbuffer = pbuffer & "--AaBbCcDd00--" bRet = InternetWriteFile(hHttpOpenRequest, _ pbuffer, _ BytesRemain, _ letti) Close #nbinfile Label1(6).Caption = bRet If bRet = False Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'the last internetwritefile ok Dim param As Long param = 0 'HSR_INITIATE penultimo lret = HttpEndRequest(hHttpOpenRequest, 0, 0, 0) Label1(7).Caption = lret If lret = 0 Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'HttpEndRequest ok result.HTTP_QUERY_CONTENT_TYPE = getQueryOption(HTTP_QUERY_CONTENT_TYPE, hHttpOpenRequest) result.HTTP_QUERY_CONTENT_LENGTH = getQueryOption(HTTP_QUERY_CONTENT_LENGTH, hHttpOpenRequest) result.HTTP_QUERY_LAST_MODIFIED = getQueryOption(HTTP_QUERY_LAST_MODIFIED, hHttpOpenRequest) result.HTTP_QUERY_PRAGMA = getQueryOption(HTTP_QUERY_PRAGMA, hHttpOpenRequest) result.HTTP_QUERY_EXPIRES = getQueryOption(HTTP_QUERY_EXPIRES, hHttpOpenRequest) result.HTTP_QUERY_VERSION = getQueryOption(HTTP_QUERY_VERSION, hHttpOpenRequest) result.HTTP_QUERY_STATUS_CODE = getQueryOption(HTTP_QUERY_STATUS_CODE, hHttpOpenRequest) result.HTTP_QUERY_STATUS_TEXT = getQueryOption(HTTP_QUERY_STATUS_TEXT, hHttpOpenRequest) result.HTTP_QUERY_RAW_HEADERS = getQueryOption(HTTP_QUERY_RAW_HEADERS, hHttpOpenRequest) result.HTTP_QUERY_RAW_HEADERS_CRLF = getQueryOption(HTTP_QUERY_RAW_HEADERS_CRLF, hHttpOpenRequest) result.HTTP_QUERY_FORWARDED = getQueryOption(HTTP_QUERY_FORWARDED, hHttpOpenRequest) result.HTTP_QUERY_SERVER = getQueryOption(HTTP_QUERY_SERVER, hHttpOpenRequest) result.HTTP_QUERY_USER_AGENT = getQueryOption(HTTP_QUERY_USER_AGENT, hHttpOpenRequest) result.HTTP_QUERY_SET_COOKIE = getQueryOption(HTTP_QUERY_SET_COOKIE, hHttpOpenRequest) result.HTTP_QUERY_REQUEST_METHOD = getQueryOption(HTTP_QUERY_REQUEST_METHOD, hHttpOpenRequest) If (Val(result.HTTP_QUERY_STATUS_CODE) <> 200) Then result.intRETURN_ERROR = Val(result.HTTP_QUERY_STATUS_CODE) result.strRETURN_ERROR = result.HTTP_QUERY_STATUS_TEXT HttpPostFromFile = False Else 'Not 200 bDoLoop = True While bDoLoop = True And bRet = True sReadBuffer = vbNullString bRet = InternetReadFile(hHttpOpenRequest, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead) ReturnString = ReturnString & Left(sReadBuffer, lNumberOfBytesRead) If Not CBool(lNumberOfBytesRead) Then bDoLoop = False Wend Label1(8).Caption = bRet If (bRet = False) Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False Else 'InternetReadFile Ok result.intRETURN_ERROR = 0 result.strRETURN_ERROR = vbNullString HttpPostFromFile = True End If End If ' Not 200 End If 'HttpEndRequest End If 'last internetwritefile End If 'all the InternetWriteFile (- the last) End If 'SendRequestEx bRet = InternetCloseHandle(hHttpOpenRequest) If (bRet = False) Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False End If End If 'HttpAddRequestHeaders ok End If 'HTTPopenrequest bRet = InternetCloseHandle(hInternetConnect) If (bRet = False) Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False End If End If 'InternetConnect bRet = InternetCloseHandle(hInternetOpen) If (bRet = False) Then result.intRETURN_ERROR = Err.LastDllError result.strRETURN_ERROR = TranslateErrorCode(CLng(result.intRETURN_ERROR)) HttpPostFromFile = False End If End If 'InternetOpen Exit Function error_handler: result.strRETURN_ERROR = Err.Description result.intRETURN_ERROR = Err.Number HttpPostFromFile = False Exit Function End Function Private Sub Form_Load() Dim rslt As HTTPTransactionResult Me.Caption = HttpPostFromFile(App.Path & "\123456.txt", Text1.Text, rslt) End Sub Прикреплённый файл123456.txt (26,61 Кбайт, скачиваний: 168) |