Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.06.2011, 12:09
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию Отправка файла через ВинИнет

Добрый день, Дамы и Господа!
Пишу программу (правда, на C++), в которой периодически требуется отсылать на веб-сервер файлы методом POST. Думаю для этой цели использовать WinInet. Но мне, к сожалению, так и не удалось реализовать работающий код. То, что сейчас сделано, не годится - скрипт PHP, принимающий файлы на сервере, запускается, код ошибки 200 (это я посмотрел в логе Апачи), но файл на сервере не создается. В то же самое время, если отправлять файл с помощью веб-формы из браузера, то все благополучно, файл сохраняется с тем именем, которое передается в качестве параметра. Не могу понять, в чем ошибка. Буду признателен за работающий код, отправляющий файлы, или за ссылку на таковой. Можно на C++, можно на Delphi, да хоть и на бэйсике - перевести смогу. В качестве SDK подойдет, кроме WinInet, и винсок, хотя, конечно, WinInet желательнее.
Большое спасибо за внимание!
Ответить с цитированием
  #2  
Старый 05.06.2011, 17:32
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

А ну ка поделись тем, что у тебя сейчас в коде. И файл php желательно, или форму отправки.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #3  
Старый 05.06.2011, 20:08
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

Вот приложение (код не мой, прошу не пинать):
Код:
#pragma comment(lib, "wininet.lib" )

#include <windows.h>
  #include <wininet.h>
  #include <iostream>


  #define ERROR_OPEN_FILE       10
  #define ERROR_MEMORY          11
  #define ERROR_SIZE            12
  #define ERROR_INTERNET_OPEN   13
  #define ERROR_INTERNET_CONN   14
  #define ERROR_INTERNET_REQ    15
  #define ERROR_INTERNET_SEND   16

  using namespace std;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  {
     // Local variables
     static char *filename   = "C:\\autoexec.bat";   //Filename to be loaded
     static char *type       = "text/plain";
     static char boundary[]  = "pippo";            //Header boundary
     static char nameForm[]  = "uploadedfile";     //Input form name
     static char iaddr[]     = "localhost";        //IP address
     static char url[]       = "upload.php";         //URL

     char hdrs[255];                  //Headers
     char * buffer;                   //Buffer containing file + headers
     char * content;                  //Buffer containing file
     FILE * pFile;                    //File pointer
     long lSize;                      //File size
     size_t result;                   


     // Open file
     pFile = fopen ( filename , "rb" );
     if (pFile==NULL) return ERROR_OPEN_FILE;

     // obtain file size:
     fseek (pFile , 0 , SEEK_END);
     lSize = ftell (pFile);
     rewind (pFile);

     // allocate memory to contain the whole file:
     content = (char*) malloc (sizeof(char)*lSize + 1);
     if (content == NULL) return ERROR_MEMORY;

	 content[lSize] = '\0';

     // copy the file into the buffer:
     result = fread (content,1,lSize,pFile);
     if (result != lSize) return ERROR_SIZE;

     // terminate
     fclose (pFile);

     //allocate memory to contain the whole file + HEADER
     buffer = (char*) malloc (sizeof(char)*lSize + 2048);

     //print header
     sprintf(hdrs,"Content-Type: multipart/form-data; boundary=%s",boundary);
     sprintf(buffer,"--%s\r\nContent-Disposition: form-data; name=\"%s\"; data=\"%s\"\r\n",boundary,"autoexec.bat","autoexec.bat");
     sprintf(buffer,"%sContent-Type: %s\r\n\r\n",buffer,type);
     sprintf(buffer,"%s%s\r\n",buffer,content);
     sprintf(buffer,"%s--%s--\r\n",buffer,boundary);

     //Open internet connection
     HINTERNET hSession = InternetOpen("WinSock",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
     if(hSession==NULL) return ERROR_INTERNET_OPEN;

     HINTERNET hConnect = InternetConnect(hSession, iaddr,INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
     if(hConnect==NULL) return ERROR_INTERNET_CONN;

     HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",url, NULL, NULL, (const char**)"*/*\0", 0, 1);
     if(hRequest==NULL) return ERROR_INTERNET_REQ;

     BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), buffer, strlen(buffer));
     if(!sent) return ERROR_INTERNET_SEND;

	 char buf[1000];
	 DWORD nRead;
	 InternetReadFile(hRequest, buf, 1000, &nRead);
	 buf[nRead] = '\0';

     //close any valid internet-handles
     InternetCloseHandle(hSession);
     InternetCloseHandle(hConnect);
     InternetCloseHandle(hRequest);

     return 0;
  }
Вот PHP:
Код:
<?php 
        $path='./logs/'; 
        $return=''; 

            if(move_uploaded_file($_FILES['data']['tmp_name'], $path.$_FILES['data']['name'])){ 
                $return= "md5sum: ".md5_file($path.$_FILES['data']['name']); 
            } 
            else{$return='FALSE';} 

        echo $return; 
    ?>
Вот форма:
Код:
<form action="http://127.0.0.1/upload.php" method="post" enctype="multipart/form-data" >
<input type="file" name="data" /><br />
<input type="submit" value="send" />
<input type="hidden" name="submiited" value="1" />
</form>
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter