1

MFC C++ を使用してファイルをアップロードしようとしていますが、何らかの理由でアップロード時に無効なファイルが取得されます。これは、使用しているヘッダーまたは投稿情報が間違っていることが原因であると思われますが、数時間試行してもエラーが見つかりません。ここに私のコードがあります..専門家が私の間違いを詳しく説明していただければ幸いです.

void CFileUpload::UploadByPost(CString strFileName,CString  strServerUrl,CString strServerUploadFile)
{

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

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

if (!file.Open(strFileName.GetBuffer(),
  CFile::modeRead | CFile::shareDenyWrite))
 {
        return;
   }

CInternetSession session(L"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(/*L"www.YOURSITE.com"*/strServerUrl.GetBuffer(),NULL,INTERNET_DEFAULT_HTTP_PORT);

    pHTTP = connection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strServerUploadFile.GetBuffer());//_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.GetBuffer(), 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.GetBuffer(), 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();
    }

    TRACE(L"%s",strResponse.GetBuffer());

    //close everything up.
    pHTTP->Close();
    connection->Close();
    session.Close();
}
catch(CInternetException* e)
{
    TRACE(L"error: %d \n",e->m_dwError);
}
catch(CFileException* e)
{
    TRACE(L"error: %d \n",e->m_cause);
}
catch(...)
{
    TRACE(L" unexpected error");
}

}

ここに私のヘッダーと投稿機能があります

CString CFileUpload::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 CFileUpload::MakePreFileData(CString& strBoundary, CString& strFileName)
{
CString strFormat;
CString strData;

strFormat += _T("--%s");
strFormat += _T("\r\n");
strFormat += _T("Content-Disposition: form-data; name=\"file\"; filename=\"%s\"");
strFormat += _T("\r\n");
strFormat += _T("Content-Type: text/plain");
strFormat += _T("\r\n");
strFormat += _T(" XXXXX ");
strFormat += _T("\r\n\r\n");

strData.Format(strFormat, strBoundary,/* m_Name, strBoundary,*/ strFileName);

return strData;
}

CString CFileUpload::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=\"submit\"");
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;

}

常に無効なファイルを返します。使用しているファイルサーバーコードは次のとおりです

<?php
$allowedExts = array("log", "txt");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ((($_FILES["file"]["type"] == "text/plain")
)
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
    }
  }
else
  {
  echo "Invalid file";
  }
?> 

ここにフォームがあります

<html>
<body>

<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>

</body>
</html> 

注:-ブーストまたはポコ、カール、またはサードパーティのライブラリは使用できません..win32またはmfcのみです。

作成前と作成後のデータは次のとおりです。

ヘッダ

"Content-Type: multipart/form-data; boundary=FFF3F395A90B452BB8BEDC878DDBD152
"

事前ファイル

"--FFF3F395A90B452BB8BEDC878DDBD152
Content-Disposition: form-data; name="Filename"; filename="ddd.txt"
Content-Type: text/plain
Content-Transfer-Encoding: binary

"

投稿ファイル

"
--FFF3F395A90B452BB8BEDC878DDBD152
Content-Disposition: form-data; name="submit" value="submit"


--FFF3F395A90B452BB8BEDC878DDBD152--
"
4

2 に答える 2

0

サーバー側のコードには、次の 3 つのケースで問題が発生する可能性があります。

if ((($_FILES["file"]["type"] == "text/plain")
)
&& ($_FILES["file"]["size"] < 20000)
&& in_array($extension, $allowedExts))

恐ろしいインデントとブレースの配置とは別に、各条件を個別にテストして、php パーツが間違っていると正確に考えていることを確認しましたか?

【ミスは解消されました】

于 2013-02-12T10:59:24.443 に答える