Ftp文件上传

时间:2017-06-13 20:19:18

标签: c++ ftp

BOOL uploadFile(char *filename, char *destination_name, char *address, char *username, char *password)
{
    BOOL t = false;
    HINTERNET hint, hftp;
    hint = InternetOpen("FTP", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC);
    hftp = InternetConnect(hint, address, INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, 0 , 0);
    t = FtpPutFile(hftp, filename, destination_name, FTP_TRANSFER_TYPE_BINARY, 0);
    InternetCloseHandle(hftp);
    InternetCloseHandle(hint);
    return t;
}

这是我上传文件到服务器的功能,写得好吗? 我正在使用功能

uploadFile(workFullPath,extractFilename(workFullPath),"address","login","password");

但我的文件没有出现在ftp上。

1 个答案:

答案 0 :(得分:2)

您根本没有进行任何错误处理,因此您无法知道文件无法上传的原因。

每当WinInet函数失败时,您可以根据每个函数的WinInet文档调用GetLastError()以找出失败的原因。

如果GetLastError()返回ERROR_INTERNET_EXTENDED_ERROR,请使用InternetGetLastResponseInfo()来解决服务器错误:

  

ERROR_INTERNET_EXTENDED_ERROR
  12003个
  从服务器返回了一个扩展错误。这通常是包含详细错误消息的字符串或缓冲区。请致电InternetGetLastResponseInfo以检索错误文字。

有关使用InternetGetLastResponseInfo()的示例,请参阅WinInet的Handling Errors文档。

要注意的其他事项 - 您使用InternetOpen()标记呼叫INTERNET_FLAG_ASYNC

  

仅对来自此函数返回的句柄的句柄发出异步请求。

但是,你实际上并没有异步使用WinInet,所以你根本不应该使用那个标志。

有关如何使用WinInet FTP功能的更多详细信息,请参阅WinInet的FTP Sessions文档。

尝试更像这样的东西:

BOOL uploadFile(char *filename, char *destination_name, char *address, char *username, char *password)
{
    BOOL res = FALSE;
    DWORD err;

    HINTERNET hint = InternetOpen("FTP", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    if (hint == NULL)
    {
        err = GetLastError();
        // handle the error as needed...
        goto done;
    }

    HINTERNET hftp = InternetConnect(hint, address, INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, 0 , 0);
    if (hftp == NULL)
    {
        err = GetLastError();
        // handle the error as needed...
        goto cleanup;
    }

    res = FtpPutFile(hftp, filename, destination_name, FTP_TRANSFER_TYPE_BINARY, 0);
    if (!res)
    {
        err = GetLastError();
        // handle the error as needed...
    }

cleanup:
    if (hftp) InternetCloseHandle(hftp);
    if (hint) InternetCloseHandle(hint);

done:
    return res;
}