Что нового

Загрузка файл на сервер PHP+Autoit

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Привет из некоторое время искал способ, чтобы загрузить файл на сервер с PHP+Autoit, но не удалось найти хороший способ. Возникли проблемы на размер отправляемого файла или других проблем... Но в конце концов написал...

Код:
$File = @ScriptDir & "\body-bg.png" ; Файл который мы будем загружать на сервер
$sHost = "host.com" ; Ваш домен на хостинге
$sFormAction = "/postdata.php" ; Форма-приемник для загрузки архива

$hfile = FileOpen($File, 16)

$sFileTypeName = StringRegExpReplace($File, '^.*\\', '')

While 1
    $data = FileRead($hfile, 500000) ;500000 = 1мб
    If @error Then ExitLoop
	Global $Data2 = StringTrimLeft($data,2)
	SendPost()
WEnd

Func SendPost()	
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
$oRequest.Open('POST', 'http://' & $sHost & $sFormAction, 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'Mozilla/4.0 (Windows XP 5.1)') ;Указываем заголовок User-Agent
$oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
$oRequest.SetRequestHeader('Host', $sHost)
$oRequest.Send('filename=' & $sFileTypeName & '&data=' & $Data2) ;отправляем запрос
$sData = $oRequest.ResponseText
;MsgBox(0, 'Data', $sData)
EndFunc


Код:
<?php
$fileName = $_POST['filename'];
$binaryData = $_POST['data'];

$fh = fopen("./$fileName", 'a+b');
fwrite($fh, pack("H*" , $binaryData));
fclose($fh);
?>




http://autoit-script.ru/index.php/topic,12485.0.html
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
armenxxx1
А вопрос в чём?
 
Автор
A

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
У меня нет вопросов, просто хотел показать, если кто-то нуждается...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Тогда вы разделом ошиблись :smile:
 

VladUs

Скриптер
Сообщения
621
Репутация
181
А кто подскажет как в php скопировать файлы с сервера на локальный компьютер ? :scratch:
 
Автор
A

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Код:
InetGetX('http://www.google.com/intl/en_ALL/images/logo.gif', @ScriptDir & "\google.gif")
Func InetGetX($sURL, $sFilename, $sUserAgent = "")
    
    ;If User Agent string is empty, use Firefox 3.0
    If $sUserAgent = "" Then
        $sUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; InfoPath.1)"
    EndIf
    
    $oHTTP = ObjCreate('winhttp.winhttprequest.5.1')
    $oHTTP.Open('GET', $sURL, FALSE)
    $oHTTP.SetRequestHeader("User-Agent", $sUserAgent)
    $oHTTP.Send()
	
	$File = FileOpen($sFilename, 2)
	FileWrite($File, $oHttp.ResponseBody)
	FileClose($File)
EndFunc


Код:
InetGet("http://www.nowhere.com/somelargefile.exe", "test.exe", 1, 1)
 

atalexei

Новичок
Сообщения
3
Репутация
0
А как отправить если стоит прокси сервер (userGate 5)??? Выдает ошибку.



Добавлено:
Сообщение автоматически объединено:

Отвечу сам себе :smile:

Код:
...
$oRequest.SetRequestHeader('Host', $sHost)
$oRequest.SetProxy(2, 192.168.000.001:8080)
$oRequest.Send('filename=' & $sFileTypeName & '&data=' & $Data2) ;отправляем запрос
...
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Лучше использовать TCP/IP. И не переключается!
Код:
#include <ScreenCapture.au3>
;// - Подключение на сервер.
TCPStartup()
$host = 'Localhost'
$hrv = 'postdata.php'
$fileName = '903.jpg'
$AppG = @ScriptDir&'\'&$fileName
$sIP = TCPNameToIP($host)
$connect = TCPConnect($sIP,80)
;While 1
	_ScreenCapture_Capture($AppG)
	$hfile = FileOpen($AppG, 16)
	While 1
		$data = FileRead($hfile, 500000) ;500000 = 1мб
		If @error Then
			ExitLoop
		EndIf
		TCPSend($connect,_TextURL($hrv,$host,'filename=' & $fileName & '&data=' & StringTrimLeft($data,2)))
	WEnd
	FileClose($hfile)
;WEnd

Func _TextURL($hrv,$host,$Parametrs = '')
Local $sRequest = 'POST /'&$hrv&' HTTP/1.1' & @CRLF
$sRequest &= 'User-Agent: Mozilla/4.0 (Windows XP 5.1)' & @CRLF
$sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF
$sRequest &= 'Host: '& $host & @CRLF
$sRequest &= 'Content-Length: '&StringLen($Parametrs) & @CRLF
$sRequest &= 'Accept: */*' & @CRLF
$sRequest &= 'Connection: Keep-Alive' & @CRLF
$sRequest &= $Parametrs
EndFunc


Код:
<?php
$fileName = $_POST['filename'];
$binaryData = $_POST['data'];

$fh = fopen($fileName, 'a+b');
fwrite($fh, pack("H*" , $binaryData));
fclose($fh);
?>


Добавлено:
Сообщение автоматически объединено:

А вот лучше пример, с экономии передачи данных :smile:
Код:
ConsoleWrite(_GAPI_TCPSendFile('Localhost','upload.php',@DesktopDir & '\064D14ED-FA47-4DC7-96DC-296DC15BF26F.jpg'))

Func _GAPI_TCPSendFile($host, $hrv,$File)
$sParametrs = '-----------------------------7dd177a260412'&@CRLF
$sParametrs &= 'Content-Disposition: form-data; name="dir"'&@CRLF
$sParametrs &= @CRLF
$sParametrs &= './'&@CRLF
$sParametrs &= '-----------------------------7dd177a260412'&@CRLF
$sParametrs &= 'Content-Disposition: form-data; name="uploadfile"; filename="'&$File&'"'&@CRLF
$sParametrs &= 'Content-Type: image/pjpeg'&@CRLF
$sParametrs &= @CRLF
$sParametrs &= FileRead($File)&@CRLF
$sParametrs &= '-----------------------------7dd177a260412--'&@CRLF

Local $sRequest = 'POST /'&$hrv&' HTTP/1.1'&@CRLF
$sRequest &= 'Content-Type: multipart/form-data; boundary=---------------------------7dd177a260412'&@CRLF
$sRequest &= 'Host: '&$host&@CRLF
$sRequest &= 'Content-Length: '&StringLen($sParametrs)&@CRLF
$sRequest &= 'Cache-Control: no-cache'&@CRLF


$sRequest &= @CRLF
$sRequest &= $sParametrs
if TCPStartup() == 0 Then Return -1 ; Невозможно инитилизировать подключение.
Local $sIP = TCPNameToIP($host)
If @error Then Return -2
Local $iSocket = TCPConnect($sIP, 80)
If @error Then Return -3
TCPSend($iSocket, $sRequest)
If @error Then Return -4
Local $sData = '', $iTimer = TimerInit(), $TimeWait = ((1000*(StringLen($sRequest)/1024))+30000) ;запускаем таймер
Do
    $sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    $iError = @error
    If $sBuffer Then ;если удалось получить сообщение
        $sData &= $sBuffer ;сохраняем полученное сообщение
		$TimeWait = 2000
        $iTimer = TimerInit() ;обнуляем таймер
    EndIf
Until $iError <> 0 Or TimerDiff($iTimer) > $TimeWait
TCPShutdown()
Return $sData
EndFunc


Код:
<?php
 
// Каталог, в который мы будем принимать файл:
$uploaddir = $_POST['dir'];
$uploadfile = $uploaddir.basename($_FILES['uploadfile']['name']);
 
// Копируем файл из каталога для временного хранения файлов:
if (copy($_FILES['uploadfile']['tmp_name'], $uploadfile))
{
echo "<h3>Файл успешно загружен на сервер</h3>";
}
else { echo "<h3>Ошибка! Не удалось загрузить файл на сервер!</h3>"; exit; }
 
// Выводим информацию о загруженном файле:
echo "<h3>Информация о загруженном на сервер файле: </h3>";
echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['uploadfile']['name']."</b></p>";
echo "<p><b>Mime-тип загруженного файла: ".$_FILES['uploadfile']['type']."</b></p>";
echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['uploadfile']['size']."</b></p>";
echo "<p><b>Временное имя файла: ".$_FILES['uploadfile']['tmp_name']."</b></p>";
echo "<p><b>Файл загружен в: ".$uploadfile."</b></p>";
 
?>
 

ZloePelme666ko

Новичок
Сообщения
18
Репутация
1
Немного некропостинга... :stars:
Пришлось столкнуться с этой проблемой, Ganibal95 вдохновил кодом. Но была одна ошибка: файл читался полностью в переменную, а если размер файла велик, то есть риск вылететь с ошибкой. Так же добавил возможность динамически натыкать POST - переменных.

Собственно сабж:
Код:
global $aVars[2][2]
$aVars[0][0]='param1'
$aVars[0][1]='val1'
$aVars[1][0]='param2'
$aVars[1][1]='val2'

$sFile=FileOpenDialog("","","all (*.*)")
ConsoleWrite(_HTTP_PostFile($sFile,"UploadFile",'127.0.0.1','tst.php',80,$aVars))

; #FUNCTION# ====================================================================================================================
; Name ..........: _HTTP_PostFile
; Description ...:
; Syntax ........: _HTTP_PostFile($sFile, $sFilevar, $sIp, $sTarget[, $iPort = 80[, $aVars = False]])
; Parameters ....: $sFile               - Файл для передачи
;                  $sFilevar            - Название файла в массиве $_FILES в PHP
;                  $sIp                 - IP адрес сервера
;                  $sTarget             - путь к скрипту PHP на сервере
;                  $iPort               - Порт хоста. Default is 80.
;                  $aVars               - Массив переменных,которые будут дополнительно переданы.
;											Формат: [i][name]
;													[i][value]
;										 В PHP найти их можно в $_POST[name]
; Return values .: Возвращает текст страницы
; Author ........: Pelme666ko
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _HTTP_PostFile($sFile,$sFilevar,$sIp,$sTarget,$iPort=80,$aVars=False)
	local $sFilename=StringRegExpReplace($sFile, '(?:^.*)\\(.*)$', '\1');					получаем имя файла
	Local $sBoundary='---PeLmE666kO---'&Random(10000,99999,1);								разделитель
	local $sBuffer,$sBody='',$sHeader=''
	;ЕСЛИ ЕСТЬ ПЕРЕМЕННЫЕ, ТО ВСТАВЛЯЕМ ИХ
	If $aVars<>False Then
		local $i=0
		for $i=0 To UBound($aVars)-1
			$sBody&='--'&$sBoundary&@CRLF
			$sBody&='Content-Disposition: form-data; name="'&$aVars[$i][0]&'"'&@CRLF&@CRLF
			$sBody&=$aVars[$i][1]&@CRLF
		Next
	EndIf
	;ПЕРЕХОДИМ К ФАЙЛУ
	$sBody&='--'&$sBoundary&@CRLF
	$sBody&='Content-Disposition: form-data; name="'&$sFilevar&'"; filename="'&$sFilename&'"'&@CRLF
	$sBody&='Content-Type: application/octet-stream'&@CRLF
	$sBody&='Content-Transfer-Encoding: binary'&@CRLF&@CRLF
	;РАСЧЕТ  Content-Length
	Local $ContentLength=StringLen($sBody)+StringLen(@CRLF&'--'&$sBoundary&'--'&@CRLF)+FileGetSize($sFile)
	;СТРОИМ HTTP ЗАГОЛОВОК
	$sHeader&='POST /'&$sTarget&' HTTP/1.1'&@CRLF
	$sHeader&='Host: '&$sIp&@CRLF
	$sHeader&='Content-Type: multipart/form-data; boundary='&$sBoundary&@CRLF
	$sHeader&='Content-Length: '&$ContentLength&@CRLF
	$sHeader&='Cache-Control: no-cache'&@CRLF&@CRLF

	Local $hFile=FileOpen($sFile,16);ОТКРЫВАЕМ ФАЙЛ ДЛЯ ДВОЧНОГО ЧТЕНИЯ

	if TCPStartup() == 0 Then Return -1 ; Невозможно инициализировать подключение.
	Local $iSocket = TCPConnect($sIp, $iPort)
	If @error Then Return -2 ; Не удалось подключиться к серверу
	TCPSend($iSocket, $sHeader) ; Отправляем заголовок
	If @error Then Return -4 ; Не удалось отправить кусок
	TCPSend($iSocket, $sBody) ; Отправляем тело
	If @error Then Return -4 ; Не удалось отправить кусок
	While 1;Циклично читаем файл и отправляем порциями по 8кб
		$sBuffer=FileRead($hFile,8192)
		if @error Then ExitLoop
		TCPSend($iSocket,$sBuffer)
		If @error Then Return -4 ; Не удалось отправить кусок
	WEnd
	TCPSend($iSocket, @CRLF&'--'&$sBoundary&'--'&@CRLF) ; отправляем завершающий разделитель
	If @error Then Return -4 ; Не удалось отправить кусок
	Local $sResponse = '', $iTimer = TimerInit(), $TimeWait = ($ContentLength*10000) ;запускаем таймер
	While 1
		$sBuffer = TCPRecv($iSocket, 2048) ;получаем часть сообщения сервера
		if @error Then ExitLoop
		If $sBuffer Then ;если удалось получить сообщение
			$sResponse &= $sBuffer ;сохраняем полученное сообщение
			$TimeWait = 2000
			$iTimer = TimerInit() ;обнуляем таймер
		EndIf
		If TimerDiff($iTimer) > $TimeWait Then ExitLoop
	WEnd
	TCPShutdown()
	Return($sResponse)
EndFunc

Вот код странички PHP:
Код:
<?php
print_r($_POST);
print_r($_FILES);
?>

Вот результат работы скрипта:
Код:
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2015 12:50:04 GMT
Server: Apache/2.2.25 (Win32) PHP/5.3.5
X-Powered-By: PHP/5.3.5
Content-Length: 340
Content-Type: text/html

Array
(
    [param1] => val1
    [param2] => val2
)
Array
(
    [UploadFile] => Array
        (
            [name] => Clutch - 10001110101.mp3
            [type] => application/octet-stream
            [tmp_name] => C:\web\data\uploads\php7A74.tmp
            [error] => 0
            [size] => 12077056
        )

)

Вдруг сэкономлю кому-нибудь время
 

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
armenxxx1 сказал(а):
Привет из некоторое время искал способ, чтобы загрузить файл на сервер с PHP+Autoit, но не удалось найти хороший способ. Возникли проблемы на размер отправляемого файла или других проблем... Но в конце концов написал...

Код:
$File = @ScriptDir & "\body-bg.png" ; Файл который мы будем загружать на сервер
$sHost = "host.com" ; Ваш домен на хостинге
$sFormAction = "/postdata.php" ; Форма-приемник для загрузки архива

$hfile = FileOpen($File, 16)

$sFileTypeName = StringRegExpReplace($File, '^.*\\', '')

While 1
    $data = FileRead($hfile, 500000) ;500000 = 1мб
    If @error Then ExitLoop
	Global $Data2 = StringTrimLeft($data,2)
	SendPost()
WEnd

Func SendPost()	
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
$oRequest.Open('POST', 'http://' & $sHost & $sFormAction, 0) ;Создаём соеденение, указываем адрес страницы
$oRequest.SetRequestHeader('User-Agent', 'Mozilla/4.0 (Windows XP 5.1)') ;Указываем заголовок User-Agent
$oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
$oRequest.SetRequestHeader('Host', $sHost)
$oRequest.Send('filename=' & $sFileTypeName & '&data=' & $Data2) ;отправляем запрос
$sData = $oRequest.ResponseText
;MsgBox(0, 'Data', $sData)
EndFunc


Код:
<?php
$fileName = $_POST['filename'];
$binaryData = $_POST['data'];

$fh = fopen("./$fileName", 'a+b');
fwrite($fh, pack("H*" , $binaryData));
fclose($fh);
?>




http://autoit-script.ru/index.php/topic,12485.0.html

Почемуб если в качестве файла для завгрузкиб вместо body-bg.png указываю имя текстового файла, то он загружается, но когда меняю содержимое загружаемого файла, то на сервере оказывается что файл не вновь загруженный, а дописанный?
Как именно перезаписать тот файл, который пытаюсь загрузить,

Разобрался сам :laugh:
Проблема в PHP в моем случае он должен быть:
Код:
<?php
$fileName = $_POST['filename'];
$binaryData = $_POST['data'];

$fh = fopen("./$fileName", 'w');
fwrite($fh, pack("H*" , $binaryData));
fclose($fh);
?>
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
ВиталийВВ

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.




Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх