當前位置:首頁 » 文件管理 » mfc上傳文件

mfc上傳文件

發布時間: 2022-06-09 23:03:21

⑴ 基於mfc的socket編程怎麼進行文件傳輸

1. 採用了多線程的方法,文件傳輸時使用AfxBeginThread()開啟新線程

void CClientsockDlg::OnBnClickedSend()
{
pThreadSend = AfxBeginThread(Thread_Send,this);/
}

文件的發送和接收都開起了新線程

UINTThread_Send(LPVOID lpParam)
{
代碼略…
}

2. 支持從配置文件configuration.ini中獲取伺服器參數

採用GetPrivateProfileString()和GetPrivateProfileInt()分別獲取位於ServerConfiguration.ini文件中的String類型的IP和int類型的port
CString IP;
int port;
GetPrivateProfileString
(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(10),10,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

3. 採用了面向對象的設計方式,功能之間按模塊劃分
MFC本身具有良好的面向對象的特性,本程序嚴格按照MFC框架結構編寫代碼,每個按鈕對應一個功能函數,降低了代碼之間的耦合性,有利於程序的擴展和復用。

void CServersockDlg::OnBnClickedChoose()
void CServersockDlg::OnBnClickedSend()
void CServersockDlg::OnBnClickedRecvdata()
void CServersockDlg::OnBnClickedAbout()
void CServersockDlg::OnBnClickedWriteini()

4. 採用了CSocket類,代碼相對更簡單
CSocket類是MFC框架對socket編程中的winsockAPI的封裝,因此通過這個類管理收發數據更加便利。代碼也跟那個既簡單易懂。
//創建
if(!Clientsock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗:%d"),GetLastError());
AfxMessageBox(str);
}
//連接
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失敗:%d"),GetLastError());
AfxMessageBox(str);
}
else
{
AfxMessageBox(_T("Socket連接成功"));
代碼略…
//發送
while(nSize<FindFileData.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nSend =file.Read(szBuff,1024);
Clientsock.Send(szBuff,nSend);//發送數據
nSize += nSend;
}
file.Close();
delete szBuff;
Clientsock.Close();
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
AfxMessageBox(_T("文件發送成功"));
dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));
}
return 0;

5. 支持數據在伺服器與客戶端之間雙向傳輸

本程序不但可以從客戶端往伺服器端傳文件,而且可以從伺服器端往客戶端傳文件。
但是互傳文件的方式並不是完全相同的。
伺服器端不管是接收文件還是發送文件始終是對綁定的埠進行監聽。
//綁定
if(!Serversock.Bind(port))
{
CString str;
str.Format(_T("Socket綁定失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//監聽
if(!Serversock.Listen(10))
{
CString str;
str.Format(_T("Socket監聽失敗:%d"),GetLastError());
AfxMessageBox(str);
}

客戶端不管是接收文件還是發送文件始終是進行連接。
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失ì敗:%d"),GetLastError());
AfxMessageBox(str);
}
else
{
略…

6. 完全圖形化操作界面

二.軟體使用說明

客戶端主界面如圖所示:

單擊「選擇文件」彈出文件對話框,選擇一個要發送的文件,同時保存文件的路徑。
單擊「發送」則會讀取ServerConfiguration.ini文件中的配置信息(IP和port),並根據此信息建立Socket連接,發送文件。注意:伺服器端應該先單擊了「接受客戶端數據」,否則發送失敗。
單擊「接收」也會讀取ServerConfiguration.ini文件中的配置信息(IP和port),並根據此信息建立Socket連接,接收文件。注意:伺服器端應該先選擇了向客戶端發送的文件,並單擊了「發送」,否則接受失敗。
單擊「讀取配置文件」,會從ServerConfiguration.ini文件中讀取配置信息,並以可編輯的文本形式顯示出來,修改完後,單擊「寫入配置文件」,會將修改後的信息保存到配置文件中。
單擊「關於」可以了解到軟體相關信息。
代碼注釋里有更詳細的說明

伺服器端主界面如圖所示

u 單擊「接受客戶端數據」,開始監聽客戶端的鏈接。
u 單擊「選擇文件」彈出文件對話框,選擇一個要發送的文件,同時保存文件的路徑。
u 單擊「發送」則會讀取ServerConfiguration.ini文件中的配置信息(port),並監聽對應埠,准備發送文件。注意:客戶端選擇「接收」以後才能發送成功。
u 單擊「讀取配置文件」,會從ServerConfiguration.ini文件中讀取配置信息,並以可編輯的文本形式顯示出來,修改完後,單擊「寫入配置文件」,會將修改後的信息保存到配置文件中。但是伺服器的IP是不可以修改的,它是在程序開始運行時從伺服器所在機器的網卡上獲取的。
u 單擊「關於」可以了解到軟體相關信息。
u 代碼注釋里有更詳細的說明

代碼下載地址:http://download.csdn.net/detail/leixiaohua1020/6320417

在此附上客戶端使用CSocket發起連接的代碼
[cpp] view plain
//----------------------------發送文件的線程------------------------------
UINT Thread_Send(LPVOID lpParam)
{
CClientsockDlg *dlg=(CClientsockDlg *)lpParam;
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(FALSE);

CSocket Clientsock; //definition socket.
if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}

CString IP;
int port;
GetPrivateProfileString(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(100),100,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");
//創建
if(!Clientsock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//連接
// if(!Clientsock.Connect(_T("127.0.0.1"),8088))
if(!Clientsock.Connect(IP,port))
{
CString str;
str.Format(_T("Socket連接失敗: %d"),GetLastError());
AfxMessageBox(str);
}
else
{
AfxMessageBox(_T("Socket連接成功"));
WIN32_FIND_DATA FindFileData;
CString strPathName; //定義用來保存發送文件路徑的CString對象
dlg->GetDlgItemTextW(IDC_FILEPATHNAME,strPathName);
FindClose(FindFirstFile(strPathName,&FindFileData));
Clientsock.Send(&FindFileData,sizeof(WIN32_FIND_DATA));

CFile file;
if(!file.Open(strPathName,CFile::modeRead|CFile::typeBinary))
{
AfxMessageBox(_T("文件不存在"));
return 1;
}

UINT nSize = 0;
UINT nSend = 0;

char *szBuff=NULL;
//發送
while(nSize<FindFileData.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nSend = file.Read(szBuff,1024);
Clientsock.Send(szBuff,nSend);//發送數據
nSize += nSend;
}
file.Close();
delete szBuff;
Clientsock.Close();
(dlg->GetDlgItem(IDC_SEND))->EnableWindow(TRUE);
AfxMessageBox(_T("文件發送成功"));
dlg->SetDlgItemTextW(IDC_FILEPATHNAME,_T(""));
}
return 0;
}

以及伺服器端使用CSocket監聽的代碼:
[cpp] view plain
//----------------------------監聽文件的線程------------------------------
UINT Thread_Func(LPVOID lpParam) //接收文件的線程函數
{
CServersockDlg *dlg = (CServersockDlg *)lpParam; //獲取對話框指針
(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(FALSE);

if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
}

CString IP;
int port;
GetPrivateProfileString(L"ServerConfiguration",L"IP",L"沒有讀取到數據!",IP.GetBuffer(100),100,L".\\configuration.ini");
port=GetPrivateProfileInt(L"ServerConfiguration",L"port",0,L".\\configuration.ini");

char errBuf[100]={0};// 臨時緩存

SYSTEMTIME t; //系統時間結構

CFile logErrorfile;
if(!logErrorfile.Open(_T("logErrorfile.txt"),CFile::modeCreate|CFile::modeReadWrite))
{
return 1;
}

CSocket Serversock;
CSocket Clientsock;
//創建
if(!Serversock.Socket())
{
CString str;
str.Format(_T("Socket創建失敗: %d"),GetLastError());
AfxMessageBox(str);
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
Serversock.SetSockOpt(SO_REUSEADDR,(void *)&bOptVal,bOptLen,SOL_SOCKET);

//綁定
if(!Serversock.Bind(port))
{
CString str;
str.Format(_T("Socket綁定失敗: %d"),GetLastError());
AfxMessageBox(str);
}
//監聽
if(!Serversock.Listen(10))
{
CString str;
str.Format(_T("Socket監聽失敗: %d"),GetLastError());
AfxMessageBox(str);
}

GetLocalTime(&t);
sprintf_s(errBuf,"伺服器已經啟動...正在等待接收文件...\r\n時間:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
t.wHour,t.wMinute,t.wSecond);
int len = strlen(errBuf);
logErrorfile.Write(errBuf,len);
AfxMessageBox(_T("啟動成功等待接收文件"));
while(1)
{
//AfxMessageBox(_T("伺服器啟動成功..."));
if(!Serversock.Accept(Clientsock)) //等待接收
{
continue;
}
else
{
WIN32_FIND_DATA FileInfo;
Clientsock.Receive(&FileInfo,sizeof(WIN32_FIND_DATA));

CFile file;
file.Open(FileInfo.cFileName,CFile::modeCreate|CFile::modeWrite);
//AfxMessageBox(FileInfo.cFileName);
int length = sizeof(FileInfo.cFileName);
logErrorfile.Write(FileInfo.cFileName,length);
//Receive文件的數據

UINT nSize = 0;
UINT nData = 0;

char *szBuff=NULL;

while(nSize<FileInfo.nFileSizeLow)
{
szBuff = new char[1024];
memset(szBuff,0x00,1024);
nData=Clientsock.Receive(szBuff,1024);
file.Write(szBuff,nData);
nSize+=nData;
}

delete szBuff;
Serversock.Close();
Clientsock.Close();
file.Close();
(dlg->GetDlgItem(IDC_RECVDATA))->EnableWindow(TRUE);
sprintf_s(errBuf,"文件接收成功...\r\n時間:%d年%d月%d日 %2d:%2d:%2d \r\n",t.wYear,t.wMonth,t.wDay,
t.wHour,t.wMinute,t.wSecond);
int len = strlen(errBuf);
logErrorfile.Write(errBuf,len);
//AfxMessageBox(_T("文件接收成功..."));
break;
}
}
return 0;
}

⑵ MFC使用ftp上傳文件,出現文件名中文亂碼

把編碼格式改成多字元集

⑶ 用mfc做文件傳輸工具時選好了傳輸文件怎麼顯示在前面的edit控制項欄中

為EDIT控制項關聯一個CString類型的成員變數m_strPath,然後在按鈕的消息響應函數中添加如下代碼就可以了:
CFileDialog dlg(TRUE, NULL, NULL, 0, "點陣圖文件 (*.bmp)|*.bmp|所有文件 (*.*)|*.*||");
if (dlg.DoModal() == IDOK)
{
m_strPath = dlg.GetPathName();
UpdateData(FALSE);
}

⑷ 我用MFC的CSocket做了一個向伺服器上傳文件的程序,但是伺服器端沒有反應,哪位大神能幫我一下!

1、伺服器端埠是否正確打開。

2、客戶端和服務端是否握手成功。
3、伺服器端軟體部分協議是否正確。
4、沒看到你的「主要代碼」,你鏈接的是每個人自己的網路空間。

⑸ mfc文件傳輸問題

socket套接字,傳文件一般都用ftp協議,Linux下有源碼,你可以參考一下。
windows應該是winsock。

⑹ 怎麼用MFC導入txt文檔

1.先把列表框裡面的內容保存到變數temp中,把下列代碼加入到按鈕的響應函數即可。

CFile outf = CFile("out.txt");
outf.out(temp);
outf.flush();

另外C++裡面的文件操作,可以原封不動地搬到mfc中,如果你在C++語言裡面會,也可以用C++的庫函數實現文件操作。

2.常式:
CString strFile = "c:\\test.txt";
CFile f;
f.Open(strFile, CFile::modeRead);
char* str = new char[f.GetLength()];
f.Read(str, f.GetLength());
f.Close();

GetDlgItem(IDC_EDIT_VALUE)->SetWindowText(str);

⑺ 在MFC中用winsock方法解決文件傳輸問題

為什麼要sleep,「不然接收數據就會出錯」是啥,你到底幹了什麼神奇的事情…………

我先問一下,你會用非同步套接字嗎?你所謂的「不然接收數據就會出錯」是不是指調用接收函數,但是事實上沒有數據過來,此時它返回錯誤?

你不要多線程,mfc程序平時都在執行一個消息循環,所以你要做的就是往消息循環裡面添加自己的處理,然後在socket上調用wsaasyncselect,這樣數據來的時候你就會收到消息,然後執行「添加的自己的處理」,此時調用接收就不會出錯。

建議你參考一下消息方式非同步的處理。別再sleep了

好吧,我嘗試沖一個優質答案。希望能採納。

我寫了一整個教學,雖然代碼中幾乎沒有出錯判斷(為了簡化、突出重點)

所以真正實用中,要注意這些函數在執行失敗的時候會有什麼行為,然後給出正確的處理代碼

看好了:

首先創建一個對話框應用程序。為了方便使用控制項所以選了對話框應用程序

⑻ vc mfc中怎麼通過按鈕 「上傳圖片」把本機上的圖片讀入sql資料庫

圖片就是文件嘛,把文件數據全部讀入到內存然後插入到
sql資料庫
中就可以了,但不建議這樣做,因為圖片數據比較大,存入資料庫會很慢,檢索也會很慢,建議只存入圖片的路徑,比如你要存入的圖片為c:\\test.bmp,那麼你存入數據的信息就為c:\\test.bmp,當有地方要使用該圖片時,只需取出c:\\test.bmp這個路徑就可以操作該圖片了。

⑼ mfc怎麼實現上傳文件到ftp客戶端並用進度條顯示傳輸進度

創建一個線程,把this傳進去,在新線程(其實就是個函數)里搞個循環,讀取文件,設置進度,發送刷新進度條消息,直到讀取完畢,break。

⑽ mfc項目關於多個大文件的上傳和下載有什麼方法

socket+文件分割。或者是像P2P那樣,多段分別上傳

熱點內容
只編譯一個c文件 發布:2024-09-28 09:54:39 瀏覽:237
指紋密碼怎麼破 發布:2024-09-28 09:45:11 瀏覽:661
自編自選腳本 發布:2024-09-28 09:45:10 瀏覽:931
androidui教程pdf 發布:2024-09-28 09:44:13 瀏覽:899
iphone排列文件夾 發布:2024-09-28 09:30:46 瀏覽:355
安卓用什麼自拍 發布:2024-09-28 09:20:14 瀏覽:384
python聲明列表 發布:2024-09-28 08:54:52 瀏覽:15
全自動密碼指紋鎖哪裡批發 發布:2024-09-28 08:54:51 瀏覽:608
移動服務密碼怎麼查詢 發布:2024-09-28 08:54:47 瀏覽:479
怎麼配置一台主機 發布:2024-09-28 08:42:02 瀏覽:323