Отправка бинарного файла на сервер, по средствам POST метода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Отправка бинарного файла на сервер, по средствам POST метода

Сообщение Rody66 » 30.09.2011 (Пт) 13:27

Такая вот проблема... С тем, как отправить на сервер обычный текстовый файл (с помощью php скрипта на сервере), разобрался. А вот с бинарным файлом такая отправка не прокатывает и на выходе получается совсем не то, что на входе. На просторах инета нашел вариант вариант закачки файла на сервер, с использованием $_FILES . Сколько не пытался, так и не поучилось все привести к рабочему виду.
Для начала вид формы отправки на html:
Код: Выделить всё
<html>
<body>
<FORM ENCTYPE="multipart/form-data" ACTION="upload.php" METHOD=POST>
Выберете файл: <INPUT NAME="myfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Загрузить">
</FORM>
</body>
</html>

Вот так выглядит скрипт-приемник:
Код: Выделить всё
<?php
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$uploaddir='1/';
$uploadfile=$uploaddir . $myfile_name;
move_uploaded_file($myfile, $uploadfile);
?>

Через html форму файл отлично отправляется и создается в нужной мне папке, но вот с бейсиком ничего не выходит. Код на бейсике:
Код: Выделить всё
Private Sub Command1_Click()
Call Upload("http://localhost:8080/upload.php", "C:\1.exe")
End Sub

Public Function Upload(ByVal URL_PHP_Script As String, ByVal FileName As String) As Boolean
whr2.Open "POST", URL_PHP_Script, WINHTTP_FLAG_ASYNC
Call whr2.SetRequestHeader("Content-Type", "multipart/form-data")
whr2.Send "myfile=" & FileName
...

Напомню, что с созданием текстовых файлов на сервере, проблем нет (правда этим занимается другой скрипт). Думаю, проблема ясна. Заранее благодарен.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение iGrok » 30.09.2011 (Пт) 13:39

А где остальная часть кода на бейсике?
Что там вместо "..." ?

Если ничего, то оно и понятно, что не работает. Тебе ж туда ещё и тело файла нужно передать самому, а не только имя.
label:
cli
jmp label

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 30.09.2011 (Пт) 14:01

Если ничего, то оно и понятно, что не работает. Тебе ж туда ещё и тело файла нужно передать самому, а не только имя.

Логично. Но в этом и проблема, что непонятно куда же тут содержание файла надо передавать, ибо в html варианте единственная переменная, которой передаются данные - это myfile. Логично полагать, что я чего то не понимаю, и переменной myfile передается не только имя файла, но и все остальное прочее. Только вот в этом и загвоздка, как передать переменной myfile не только имя файла, но и контент, для того, чтобы файл смог успешно отправится на сервер.
А где остальная часть кода на бейсике?
Что там вместо "..." ?

Дальше лишь таймаут с ожиданием ответа.
Код: Выделить всё
Public Function Upload(ByVal URL_PHP_Script As String, ByVal FileName As String) As Boolean
On Error Resume Next
whr2.Open "POST", URL_PHP_Script, WINHTTP_FLAG_ASYNC
Call whr2.SetRequestHeader("Content-Type", "multipart/form-data")
whr2.Send "myfile=" & FileName
TimeOut = 0
Do Until whr2.StatusText = "OK" Or whr2.StatusText = "Not Found"
If blnEnd = True Then whr2.Abort: Exit Do: GoTo endscript
If TimeOut > 5000 Then whr2.Abort: GoTo endscript
Sleep 1
TimeOut = TimeOut + 2
DoEvents
Loop
If whr2.StatusText = "OK" Then
Upload = True
Else
endscript:
Upload = False
End If
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 30.09.2011 (Пт) 16:44

Rody66 писал(а):что непонятно куда же тут содержание файла надо передавать,

На сервер, куда же ещё.

Только вот в этом и загвоздка, как передать переменной myfile не только имя файла, но и контент, для того, чтобы файл смог успешно отправится на сервер.

Это не загвоздка. Это — задача.

Впрочем, ты говорил, что тебе нужно менять в файле 5 байтов. Зачем тогда тебе отправлять файл тем образом, которым организован uploading?

Поясню. Это броузеры шлют файл определённым образом, а скрипты PHP расчитан на этот способ. Сам же ты можешь слать серверу всё, что угодно и как угодно. Я так и делал, когда заказчик предъявил требование, что сервер нужно написать на PHP.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 30.09.2011 (Пт) 16:57

На сервер, куда же ещё.

Речь о переменной, которой эти данные надо передать.
Это не загвоздка. Это — задача.

Как угодно.
Впрочем, ты говорил, что тебе нужно менять в файле 5 байтов. Зачем тогда тебе отправлять файл тем образом, которым организован uploading?

Все верно, с этим проблем больше нет. Но как видно, задача усложнилась.
Поясню. Это броузеры шлют файл определённым образом, а скрипты PHP расчитан на этот способ. Сам же ты можешь слать серверу всё, что угодно и как угодно.

Не очень понимаю куда ты клонишь. Если есть более совершенный вариант аплодинга бинарного файла на сервер, буду рад услышать, а пока, мне бы с данным способом разобраться.
По сути, html код надо просто "конвертировать" в код на бейсике. Пока что это сделать не получается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 30.09.2011 (Пт) 17:03

Rody66 писал(а):Речь о переменной, которой эти данные надо передать.

Переменные — это надстройка над возможностью передавать данные. Можно взять и провозгласить: нет никаких переменных. И просто передавать данные в любом вообразимом виде.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 30.09.2011 (Пт) 17:19

Переменные — это надстройка над возможностью передавать данные. Можно взять и провозгласить: нет никаких переменных. И просто передавать данные в любом вообразимом виде.

И все-таки, как прийти к решению, или что я делаю не так?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 30.09.2011 (Пт) 17:25

Если задача отправить файл так, как это делает броузер, то нужно изучить документ, описывающий правила отправки, и написать соотв. код

Если задача отправить файл любым удобным способом, то можно либо отправить файл так же, как это делает броузер, либо просто отправить его содержимое. Либо не просто отправить его содержимое, а ещё и окружить какими-нибудь метаданными.

Действуйте, чтобы решить свою задачу, а не чтобы повторить чьё-то успешное действие.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.09.2011 (Пт) 22:01

Rody66 писал(а):Только вот в этом и загвоздка, как передать переменной myfile не только имя файла, но и контент, для того, чтобы файл смог успешно отправится на сервер.

Прочитай и отправь как написано.

Rody66 писал(а):Не очень понимаю куда ты клонишь. Если есть более совершенный вариант аплодинга бинарного файла на сервер, буду рад услышать, а пока, мне бы с данным способом разобраться.

Имелось в виду, что можно написать скрипт, заменяющий нужные байты, а не передавать весь файл.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 02.10.2011 (Вс) 1:31

Всем спасибо, с multipart/form-data пробовал, пробовал, в итоге так ни к чему и не пришел. Вопрос решил кодированием\декодированием в base64. Кстати, что интересно, при кодировании в base64 1 раз и декодирования принятых данных на сервере, конечный файл создавался слегка покоцаный (некоторые байты в середине заменились произвольными), и чексумма в итоге была разная, файл, естественно, становился не рабоче способным. Пришлось сравнивать какие данные идут на входе и какие получаются на выходе (в base64 кодированные я имею в виду), оказалось, что уже в процессе передачи кодированные данные чуть-чуть искажаются. Чисто ради интереса попробовал закодировать данные 2 раза подряд, на сервере, соответственно, 2 раза раскодировать, на мое удивление, все получилось, бинарный файл на выходе полностью идентичен файлу на входе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 02.10.2011 (Вс) 18:01

Rody66 писал(а):Всем спасибо, с multipart/form-data пробовал, пробовал, в итоге так ни к чему и не пришел.

Плохо.

Rody66 писал(а):Вопрос решил кодированием\декодированием в base64.

А ради чего? Можно передавать некодированные данные.

Rody66 писал(а):Пришлось сравнивать какие данные идут на входе и какие получаются на выходе (в base64 кодированные я имею в виду), оказалось, что уже в процессе передачи кодированные данные чуть-чуть искажаются. Чисто ради интереса попробовал закодировать данные 2 раза подряд, на сервере, соответственно, 2 раза раскодировать, на мое удивление, все получилось, бинарный файл на выходе полностью идентичен файлу на входе.

Ну ищи где-то косяк, в кодировщике/раскодировщике Base64, в неявных конвертациях между кодировками. И так далее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 02.10.2011 (Вс) 23:03

Плохо.

Конечно плохо. Но той информации, что я нашел, мне не хватило.
А ради чего? Можно передавать некодированные данные.

Само собой можно, да и плюс ко всему размер передаваемых данных увеличивается почти в 2 раза, но это хотя бы работает, и это уже радует.
Ну ищи где-то косяк, в кодировщике/раскодировщике Base64, в неявных конвертациях между кодировками. И так далее.

Дак странная вещь же, если бы проблема с кодировкой была бы на какой то из сторон, то сколько раз там не шифруй, на выходе все одно и то же будет, а именно корявый файл. Мне лично не понятно как такое может быть, интересно разобраться. Может быть есть идеи?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 02.10.2011 (Вс) 23:05

Rody66 писал(а):Дак странная вещь же, если бы проблема с кодировкой была бы на какой то из сторон, то сколько раз там не шифруй, на выходе все одно и то же будет, а именно корявый файл. Мне лично не понятно как такое может быть, интересно разобраться. Может быть есть идеи?

Ошибочный вывод.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 02.10.2011 (Вс) 23:14

Ошибочный вывод.

Тем не менее, моей обывательской логике он подчиняется. Мог бы и аргументы какие-нибудь в ответ привести..

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 02.10.2011 (Вс) 23:24

Блин, какие могут быть аргументы?
Base64 сужает множество значений, используемых для кодирования данных.
Base64 от Base64 сужает этот диапазон ещё больше.
Если символ X портится при передаче, то передача некодированного сообщения может быть фатальной, если в ней есть символ X. И в Base64 от сообщения тоже может встретиться символ X. Но в Base64 от Base64 благодаря избыточности некоторые комбинации гарантированно не встретятся.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 02.10.2011 (Вс) 23:26

Base64 сужает множество значений, используемых для кодирования данных.
Base64 от Base64 сужает этот диапазон ещё больше.
Если символ X портится при передаче, то передача некодированного сообщения может быть фатальной, если в ней есть символ X. И в Base64 от сообщения тоже может встретиться символ X. Но в Base64 от Base64 благодаря избыточности некоторые комбинации гарантированно не встретятся.

Спасибо. Видимо, вопрос исчерпан.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.10.2011 (Вс) 23:29

Rody66 писал(а):Видимо, вопрос исчерпан.

Это означает, что исправлять ты ничего не собираешься?

Rody66
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 183
Зарегистрирован: 16.01.2011 (Вс) 17:03

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Rody66 » 02.10.2011 (Вс) 23:36

Это означает, что исправлять ты ничего не собираешься?

Скажем так, исчерпан до того момента, пока кто-нибудь не подкинет новую информацию о multipart/form-data

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Хакер » 02.10.2011 (Вс) 23:47

RFC подкинет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antnariy3
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 03.10.2011 (Пн) 11:09

Re: Отправка бинарного файла на сервер, по средствам POST ме

Сообщение Antnariy3 » 03.10.2011 (Пн) 11:16

Не могу спокойно смотреть на этот адъ.
Rody66, multipart/form-data не нужен.
Код: Выделить всё
dim b() as Byte
....
whr2.Open "POST", URL_PHP_Script, WINHTTP_FLAG_ASYNC
whr2.Send b


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 30

    TopList  
cron