C Я не могу загрузить файл на FTP-сервер

#c #file-upload #ftp

#c #загрузка файла #ftp

Вопрос:

Я хочу загрузить файл на свой FTP-сервер, используя код C , и я могу использовать FTP-сервер с FileZilla.

Когда я запускаю свой код на C , он выдает ошибку «3» на выходе (функция GetLastError () вернула это значение функции FtpPutFile ()

 #pragma comment (lib,"wininet.lib")
#include <windows.h>
#include <wininet.h> //for uploadFile function
#include <iostream>
using namespace std;
int main()
{

    HINTERNET hint, hftp;
    hint = InternetOpen("FTP", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC);
    hftp = InternetConnect(hint, "MY IP ADRESS", INTERNET_DEFAULT_FTP_PORT, "MY NAME", "MY PASS", INTERNET_SERVICE_FTP, 0, 0);

    if (!FtpPutFile(hftp, "C://Users//Elliot//Desktop//log.txt", "//log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
    {
        cout << "FAIL !" << endl;
        cout << GetLastError() << endl;
    }
    else {
        cout << "file sended !";
    };
    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);

    system("PAUSE");
}
  

вещи, которые я пробовал :

  • Смена сервера (я создал новый сервер, но результат все тот же)

  • Управление брандмауэром

  • Запуск от имени администратора

  • точки останова (файл ftpput выдает ошибку)

Комментарии:

1. C://Users//Elliot//Desktop//log.txt это странный способ указать имя файла в Windows, я бы ожидал C:\Users\Elliot\Desktop\log.txt

2. Из первых уст: ОШИБКА_PATH_NOT_FOUND

3. Я изменил на «\ «, все еще не работает … что я могу сделать еще?

4. Не уверен, какой путь его так оскорбляет, путь к локальному файлу или удаленный путь или … fud. Кажется, я это вижу. Вам не нужно избегать косых черт. Дайте «/log.txt «попробуйте.

5. Удалите / на удаленном сервере имя файла: FtpPutFile(hftp, "C:\Users\Elliot\Desktop\log.txt", "log.txt", FTP_TRANSFER_TYPE_BINARY, 0) . FtpPutFile() загружает файл в текущий рабочий каталог удаленного сервера, поэтому, если вы хотите загрузить в определенную папку, сначала вызовите FtpSetCurrentDirectory() .

Ответ №1:

Сообщение об ошибке понятно. Файла там нет, отправлять нечего. Вы можете легко проверить путь к файлу с помощью std::ifstream , прежде чем продолжить работу с интернет-функциями.

Используйте FtpSetCurrentDirectory для установки целевого каталога. В этом примере, который я использовал "public_html" , возможно, ваш сервер отличается.

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

#pragma comment (lib,"wininet.lib")

using namespace std;

int main()
{
    string file = "C:\path.txt";
    string site = "www.site.com";
    string user = "username";
    string pass = "password";

    if (!ifstream(file))
    {
        cout << "no filen";
        return 0;
    }

    HINTERNET hint = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    HINTERNET hftp = InternetConnect(hint, site.c_str(), INTERNET_DEFAULT_FTP_PORT,
        user.c_str(), pass.c_str(), INTERNET_SERVICE_FTP, 0, 0);

    if (FtpSetCurrentDirectory(hftp, "public_html"))
    {
        if (!FtpPutFile(hftp, file.c_str(), "log.txt", FTP_TRANSFER_TYPE_BINARY, 0))
        {
            cout << "FAIL!" << endl;
            cout << GetLastError() << endl;
        }
        else
        {
            cout << "file sended !";
        }
    }
    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);
    return 0;
}