首页 > Windows开发 > 详细

WinHttp WinHttpSendRequest 上传文件 dwTotalLength 参数值 在 C# PHP 中表现不一致

时间:2017-04-17 18:42:02      阅读:261      评论:0      收藏:0      [点我收藏+]

近日在用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 中表现不一致

原文:http://www.cnblogs.com/patch/p/6724169.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!