WinHttp WinHttpSendRequest 上傳檔案 dwTotalLength 參數值 在 C# PHP 中表現不一致

來源:互聯網
上載者:User

標籤:包含   logs   strlen   end   file   發送   報文   ade   上傳檔案   

近日在用WinHttpSendRequest做檔案上傳的時候。

使用ashx接收檔案資料時可以正常接收到檔案資料,但是在php頁面empty($_FILES)顯示為TRUE,這一現象讓我開始了1天的追查。

最終請求代碼如下

        dwContentLength = strlen(szpt2);        ZeroMemory(wszContentLength,1024);        wsprintf(wszContentLength, _T("Content-Length: %d"), dwContentLength);        WinHttpAddRequestHeaders(hRequest, wszContentLength, (ULONG) -1L, WINHTTP_ADDREQ_FLAG_ADD | WINHTTP_ADDREQ_FLAG_REPLACE);

 

1         bResults = WinHttpSendRequest( hRequest,2             WINHTTP_NO_ADDITIONAL_HEADERS,3             NULL, 4             (LPSTR)szpt2, 5             dwContentLength, 6             0,//dwTotalLength 參數必須填寫,除非這個請求不包含資料WINHTTP_NO_REQUEST_DATA or 0
7        0);

關鍵在紅色部分,如果為0,在ashx檔案中是仍然可以收到檔案的。。。但是在php顯示無檔案資料。抓包顯示確實提交了資料。

幾經尋找嘗試後發現dwTotalLength填寫dwContentLength值時,php接收也正常了。

        bResults = WinHttpSendRequest( hRequest,            WINHTTP_NO_ADDITIONAL_HEADERS,            NULL,             (LPSTR)szpt2,             dwContentLength,             dwContentLength, //dwTotalLength 參數必須填寫,除非這個請求不包含資料WINHTTP_NO_REQUEST_DATA or 0            0);

 

MSDN上對這個參數的描述是

dwTotalLength [in]

一個無符號長整數值,其中包含發送總資料的長度(以位元組為單位)。此參數指定請求的Content-Length頭。如果該參數的值大於由指定的長度大於 dwOptionalLength,然後 WinHttpWriteData可以被用來發送額外的資料。

dwTotalLength不能通話之間切換,以WinHttpSendRequest了同樣的要求。如果需要更改dwTotalLength,則調用者應該建立一個新的請求。

 

這時候大致猜測到是平台實現的差異了,抓包顯示dwTotalLength不管是設定0還是dwContentLength,http報文顯示的都是dwContentLength的長度

不過我用其他抓包工具Wireshark時疑似看到了2個Content-Length資料,由於問題已經解決所以就沒有在確認是否真的出現了2個Content-Length。

 

總結:PHP在檔案接收方面可能存在資料驗證bug

 

WinHttp WinHttpSendRequest 上傳檔案 dwTotalLength 參數值 在 C# PHP 中表現不一致

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.