سؤال

كيف يمكنني تحميل الملفات إلى خادم الويب باستخدام c++ و MFC.نحن لا تستخدم .صافي.سوف تحتاج إلى فتح المقبس و أفعل كل شيء بنفسي ؟ إذا أين هو إشارة جيدة لمتابعة ؟

هل كانت مفيدة؟

المحلول

كنت لا تريد استخدام المباشر مأخذ المكالمات.من الصعب الحصول على HTTP الحق بهذه الطريقة.

أسهل طريقة هي أن WinINet Api.تحقق من مستندات InternetOpen هذا من المرجح أن يكون أول مكالمة.وظائف سوف تحتاج على الأرجح:

  • InternetOpen
  • InternetConnect
  • HttpOpenRequest
  • HttpSendRequest
  • HttpQueryInfo
  • InternetCloseHandle

يمكنك العثور على مستندات لكل هذه على msdn

نصائح أخرى

وهنا هو رمز انتهى بي الأمر باستخدام. I تجريده من تدقيق الخطأ، وغيرها من الاشياء الإخطار. هذا يقوم تحميل استمارة متعددة الأجزاء.

DWORD dwTotalRequestLength;
DWORD dwChunkLength;
DWORD dwReadLength;
DWORD dwResponseLength;
CHttpFile* pHTTP = NULL;

dwChunkLength = 64 * 1024; 
void* pBuffer = malloc(dwChunkLength);
CFile file ;

CInternetSession session("sendFile");
CHttpConnection *connection = NULL;

try {
//Create the multi-part form data that goes before and after the actual file upload.

CString strHTTPBoundary = _T("FFF3F395A90B452BB8BEDC878DDBD152");       
CString strPreFileData = MakePreFileData(strHTTPBoundary, file.GetFileName());
CString strPostFileData = MakePostFileData(strHTTPBoundary);
CString strRequestHeaders = MakeRequestHeaders(strHTTPBoundary);
dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + file.GetLength();

connection = session.GetHttpConnection("www.YOURSITE.com",NULL,INTERNET_DEFAULT_HTTP_PORT);

pHTTP = connection->OpenRequest(CHttpConnection::HTTP_VERB_POST, _T("/YOUURL/submit_file.pl"));
pHTTP->AddRequestHeaders(strRequestHeaders);
pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);

//Write out the headers and the form variables
pHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());

//upload the file.

dwReadLength = -1;
int length = file.GetLength(); //used to calculate percentage complete.
while (0 != dwReadLength)
{
    dwReadLength = file.Read(pBuffer, dwChunkLength);
    if (0 != dwReadLength)
    {
    pHTTP->Write(pBuffer, dwReadLength);
    }
}

file.Close();

//Finish the upload.
pHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
pHTTP->EndRequest(HSR_SYNC);


//get the response from the server.
LPSTR szResponse;
CString strResponse;
dwResponseLength = pHTTP->GetLength();
while (0 != dwResponseLength )
{
    szResponse = (LPSTR)malloc(dwResponseLength + 1);
    szResponse[dwResponseLength] = '\0';
    pHTTP->Read(szResponse, dwResponseLength);
    strResponse += szResponse;
    free(szResponse);
    dwResponseLength = pHTTP->GetLength();
}

AfxMessageBox(strResponse);

//close everything up.
pHTTP->Close();
connection->Close();
session.Close();

CString CHelpRequestUpload::MakeRequestHeaders(CString& strBoundary)
{
CString strFormat;
CString strData;
strFormat = _T("Content-Type: multipart/form-data; boundary=%s\r\n");
strData.Format(strFormat, strBoundary);
return strData;
}

CString CHelpRequestUpload::MakePreFileData(CString& strBoundary, CString& strFileName)
{
CString strFormat;
CString strData;

strFormat = _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"user\"");
strFormat += _T("\r\n\r\n");
strFormat += _T("%s");
strFormat += _T("\r\n");

strFormat += _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"email\"");
strFormat += _T("\r\n\r\n");
strFormat += _T("%s");
strFormat += _T("\r\n");

strFormat += _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"filename\"; filename=\"%s\"");
strFormat += _T("\r\n");
strFormat += _T("Content-Type: audio/x-flac");
strFormat += _T("\r\n");
strFormat += _T("Content-Transfer-Encoding: binary");
strFormat += _T("\r\n\r\n");

strData.Format(strFormat, strBoundary, m_Name, strBoundary, m_Email,  strBoundary, strFileName);

return strData;
 }

CString CHelpRequestUpload::MakePostFileData(CString& strBoundary)
{

CString strFormat;
CString strData;

strFormat = _T("\r\n");
strFormat += _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"submitted\"");
strFormat += _T("\r\n\r\n");
strFormat += _T("");
strFormat += _T("\r\n");
strFormat += _T("--%s--");
strFormat += _T("\r\n");

strData.Format(strFormat, strBoundary, strBoundary);

return strData;

} 

وWININET كما اقترح. نضع في اعتبارنا أن هناك فئات MFC أن التفاف واجهات برمجة التطبيقات. إذا كان لسبب واجهات برمجة التطبيقات ليست engouh مرنة لمتطلبات الخاص بك (على سبيل المثال، تحتاج إلى تنفيذ اتصال من خلال الوكيل بما في ذلك التوثيق)، وإعطاء نظرة يستخدم WinHttp. انها مجموعة شاملة من WININET (لا مغلفة MFC على الرغم من ليستخدم WinHttp).

هل يمكن استخدام BITS:

http://www.codeproject.com/KB/IP/bitsman.aspx

ويمكنك أيضا استخدام XMLHTTP. حتى لو كنت لا ترسل XML. بنيت على WinINet في، ولكن قليلا أسهل للاستخدام (إذا كنت تستخدم للعمل مع COM على أي حال).
انظر MSDN: http://msdn.microsoft.com/en-us/library /ms759148.aspx

إذا كان لديك ملقم بروتوكول نقل الملفات، تحقق من الطبقة CFtpConnection.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top