|
Познающий
Регистрация: 04.07.2008
Сообщений: 56
Провел на форуме: 390892
Репутация:
60
|
|
Аплоад файла по HTTP протоколу.
Данный исходный текст показывает как отослать файл на сервер по http протоколу методом POST. Имя файла передается в поле Request-URI, сам файл в Entity-Body. На сервере обрабатывает запрос и сохраняет файл простейший скрипт upload.php.
SendFileToServer.cpp:
Код:
// by SlyBit (c) 07.2008 /SendFileToServer.cpp/
#include "winsock2.h"
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(linker, "/ENTRY:Entry")
#define HOST_NAME "test.ru"
#define FILE_NAME "test_file.rar"
#define URL_NAME "upload.php"
BOOL WINAPI SendDataToServer(PVOID pData, DWORD dwDataSize, WORD wPort, PCHAR pAddress)
{
SOCKET ConnectSocket;
sockaddr_in ClientService;
INT nSendBytes = 0;
if(INVALID_SOCKET == (ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))) {
return 0;
}
ClientService.sin_family = AF_INET;
ClientService.sin_port = htons(wPort);
ClientService.sin_addr.s_addr = inet_addr(pAddress);
if(SOCKET_ERROR == connect(ConnectSocket, (SOCKADDR*)&ClientService, sizeof(ClientService))) {
closesocket(ConnectSocket);
return 0;
}
if(SOCKET_ERROR == (nSendBytes = send(ConnectSocket, (PCHAR)pData, dwDataSize, 0))) {
closesocket(ConnectSocket);
return 0;
}
closesocket(ConnectSocket);
return nSendBytes;
}
BOOL WINAPI GetIpByHostName(PCHAR pHostName, PCHAR pIp, DWORD dwIpSize)
{
hostent *pHosten;
if(!(pHosten = gethostbyname(pHostName))) {
return 0;
}
if(lstrlen(inet_ntoa(*(in_addr*)*pHosten->h_addr_list)) > dwIpSize) {
return 0;
}
lstrcpy(pIp, inet_ntoa(*(in_addr*)*pHosten->h_addr_list));
return 1;
}
BOOL WINAPI SendFileToServer(PCHAR pFileName, PCHAR pAddress, PCHAR pUrl)
{
PVOID pFile;
DWORD dwFileSize, dwRetSize;
CHAR szIp[17];
PCHAR pSendData;
HANDLE hFile;
if(!GetIpByHostName(pAddress, szIp, 17)) {
return 0;
}
if(INVALID_HANDLE_VALUE == (hFile = CreateFile(pFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0))) {
return 0;
}
if(0xFFFFFFFF == (dwFileSize = GetFileSize(hFile, 0))) {
CloseHandle(hFile);
return 0;
}
if(!(pSendData = (PCHAR)VirtualAlloc(0, dwFileSize+300, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE))) {
VirtualFree(pFile, 0, MEM_RELEASE);
return 0;
}
wsprintf(pSendData, "POST /%s?file_name=%s HTTP/1.1\r\nHost: %s\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-length: %i\r\n\r\nupload_file=",
pUrl, pFileName, pAddress, dwFileSize+strlen("upload_file="));
if(!ReadFile(hFile, pSendData+strlen(pSendData), dwFileSize, &dwRetSize, 0)) {
VirtualFree(pSendData, 0, MEM_RELEASE);
CloseHandle(hFile);
return 0;
}
CloseHandle(hFile);
if(!SendDataToServer(pSendData, strlen(pSendData), 80, szIp)) {
VirtualFree(pSendData, 0, MEM_RELEASE);
return 0;
}
VirtualFree(pSendData, 0, MEM_RELEASE);
return 1;
}
VOID WINAPI Entry()
{
WSAData wsaData;
if(NO_ERROR != WSAStartup(MAKEWORD(2,2), &wsaData)) {
ExitProcess(0);
}
if(SendFileToServer(FILE_NAME, HOST_NAME, URL_NAME)) {
MessageBox(0, "SendFileToServer Ok", 0, 0);
} else {
MessageBox(0, "SendFileToServer Error", 0, 0);
}
ExitProcess(0);
}
upload.php:
Код:
<?php Error_Reporting(E_ALL & ~E_NOTICE);
function SaveDataToFile($log_data, $file_name)
{
$file = basename($file_name);
$filehandle = fopen($file, "wb");
fputs($filehandle, $log_data);
fclose($filehandle);
}
SaveDataToFile($_POST['upload_file'], $_GET['file_name']);
?>
Полезные ссылки:
Русский RFC по HTTP
Статья "Генерация HTTP запросов"
|