FtpPutFileW() не выгружает файл на FTP

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey
9
Andrey  

Есть функция в советнике, которая должна загружать картинку с локальной папки по FTP на удаленный сервер:

#define INTERNET_SERVICE_FTP    1
#define INTERNET_SERVICE_GOPHER 2
#define INTERNET_SERVICE_HTTP   3

#define FTP_TRANSFER_TYPE_UNKNOWN   0x00000000
#define FTP_TRANSFER_TYPE_ASCII     0x00000001
#define FTP_TRANSFER_TYPE_BINARY    0x00000002

//Importing the proper API functions to Upload a file from the proper windows library wininet.dll
//Please see Microsoft reference wininet API functions at http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx
#import "wininet.dll"
//To open an "empty" Internet Object
int InternetOpenW(string Agent, int AccessType, string ProxyName, string ProxyBypass, int Flags);
//To create a working session (connection) with the Internet Object previously created
int InternetConnectW(int hInternetSession, string ServerName, int ServerPort, string UserName, string Password, int Service, int Flags, int Context);
//To, in this case, uploading a file
bool FtpPutFileW(int hFtpSession, string LocalFile, string RemoteFile, int Flags, int Context);
bool FtpPutFileA(int hFtpSession, string LocalFile, string RemoteFile, int Flags, int Context);
//To close the Internet Object and its connections
bool InternetCloseHandle(int hInet);
#import


bool uploadFTP()
  {
   int hIntObj, hIntObjConn;
   string Password, ServerName, UserName, LocalFile, filename;
   bool Success;

//Uploading the file
   hIntObj = InternetOpenW("MyInternetObjectName", 1, NULL, NULL, NULL); //We create an object of type "Internet"
   if(hIntObj > 0)
     {
      ServerName = "18.21.12.14"; //Your ftp server
      UserName = "usrname"; //Your username you use when manually establish a ftp session
      Password = "passwd"; //Your password you use when manually establish a ftp session

      hIntObjConn = InternetConnectW(hIntObj, ServerName, 0, UserName, Password, INTERNET_SERVICE_FTP, NULL, NULL); //We hang a FTP session on our internet object created.
      //The session could have been a HTTP session or even a HTTPS session.
      //See http://msdn.microsoft.com/en-us/library/aa385473(VS.85).aspx
      if(hIntObjConn > 0)
        {
          filename = "test.png";
          LocalFile = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\test.png"; //The physical address in your local machine where the file to be uploaded is. (I put this file in MQL4/Files folder)

          ResetLastError();
          Success = FtpPutFileW(hIntObjConn, LocalFile, filename, FTP_TRANSFER_TYPE_BINARY, NULL);
          if(Success == FALSE)
             Print("Error: uploading");
          Print(GetLastError());
        }
      else
        {
         Print("Error: connect to FTP");
        }
     }
   InternetCloseHandle(hIntObj);
   return true;
  }

Фунцкия отлично работает на терминале MT4 на windows 10 x64 на домашнем копьютере. Т.е. советник выгружает тестовый файл на FTP. Оттуда он открывается. Файл в папке терминала существует и открывается, т.е. не битый.

ПРОБЛЕМА: как только я устанавливаю этого советника на VPS на такой же терминал MT4, функция перестает корректно работать. Даже версии MT4 терминалов одинаковые v.4.00 build 1260 24 Jan 2020. На VPS стоит Windows Server 2019 Standard

Что происходит: функция InternetConnectW коннектится к FTP корректно (это видно по логам FTP демона на сервере). Затем FtpPutFileW() создает пустой файл на FTP, и через 10 секунд выдет ошибку "Error: uploading", т.е. ошибку, что не удалось выгрузить файл. Функция GetLastError() выдает результат 0 (т.е. типа нет ошибок).

Исходя из этого отметаются проблемы: нет коннета с FTP; неверные данные для подключения; на FTP запрет на создание файла.

Вопрос в чем: что и где можно проверить, или использовать какую-то другую функцию, чтобы все-же удалось выгрузить файл на FTP.

p.s. функция SendFTP() мне не подходит.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий