2017-06-13 36 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'は正しいことですが、最初のエラーの後には本当に便利です。その後、Cromは何が起こったのかしか知りません。たとえば、 'InternetOpen'が' NULL'を返すとします。 'InternetConnect'を' NULL'で呼び出すと、GetLastErrorを意味のある値に設定できないことがあります。 'InternetConnect'が失敗した場合、' FtpPutFile'は何か別のことをすることができます。戻り値を早く、頻繁にチェックしてください。使用するのが安全であることがわかるまで、戻り値を使用しないでください。 – user4581301

答えて

2

あなたはエラー処理を全く行っていないので、ファイルがアップロードされない理由を知る方法がありません。

WinInet関数が失敗するたびに、それぞれの関数のWinInetドキュメントに従って、失敗した理由を確認するためにGetLastError()を呼び出すことができます。 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のHandling Errorsドキュメント:

ERROR_INTERNET_EXTENDED_ERROR戻りGetLastError()場合は、サーバーのエラーを取得するInternetGetLastResponseInfo()を使用しています。注意を払うために、他の

何か - あなたは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; 
} 
関連する問題