2017-06-13 217 views
0
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; 
} 

这是我上传文件到服务器的函数,它写得好吗? ,我使用的功能Ftp文件上传

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

但我的文件并没有出现在FTP。

+1

您测试没有成功的返回值。很难说出了什么地方出了问题或者没有检查结果。 – user4581301

+0

我在做GetlastError,但是这个返回值非常大,随机值很多,这很奇怪 –

+0

'GetLastError'是正确的东西,但它只在第一个错误后才真正有用。之后,克罗姆只知道发生了什么事。例如,说'InternetOpen'返回NULL。使用'NULL'调用'InternetConnect'可能会导致无法将GetLastError设置为有意义的值的问题。如果'InternetConnect'失败,'FtpPutFile'可能会做其他奇怪的事情。尽早并经常检查返回值。在知道安全使用之前,不要使用返回的值。 – user4581301

回答

2

你根本没有做任何错误处理,所以你无法知道文件为什么没有上传。

每当WinInet功能失败时,您可以拨打GetLastError(),查看每种功能的WinInet文档失败的原因。

如果GetLastError()回报ERROR_INTERNET_EXTENDED_ERROR,使用InternetGetLastResponseInfo()获取服务器的错误:

ERROR_INTERNET_EXTENDED_ERROR
12003
An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text.

见的WinInet的使用InternetGetLastResponseInfo()的例子Handling Errors文档。

别的东西要注意 - 你与INTERNET_FLAG_ASYNC标志调用InternetOpen()

Makes only asynchronous requests on handles descended from the handle returned from this function.

但是,你实际上并没有使用异步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; 
}