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

近日在用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 07        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

时间: 2024-10-07 00:08:37

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

spring mvc(注解)上传文件的简单例子

spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationContext.xml中 <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”/> 关于文件上传的配置不能少 大家可以看具体代码如下: web.xml &

JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用

0 ajaxFileUpload简介 ajaxFileUpload插件是一个非常简单的基于Jquery的异步上传文件的插件,使用过程中发现很多与这个同名的,基于原始版本基础之上修改过的插件,文件版本比较多,我把我自己使用的ajaxFileUpload文件上传到博客园上了,想要使用的朋友可以下载:http://files.cnblogs.com/files/fonour/ajaxfileupload.js. 整个插件源码不到200行,实现非常简单,大致原理就是通过js动态创建隐藏的表单,然后进行提

springMVC 上传文件

spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationContext.xml中 <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”/> 关于文件上传的配置不能少 大家可以看具体代码如下: web.xml &

MVC中如何上传文件

本文导读:在MVC中实现文件上传与传统的WebForm上传文件方法都差不多,在cshtml视图页面放一个file标签,然后在actionname方法中处理用户上传的文件.下面简单介绍MVC中上传文件的方法. 一.MVC中如何上传文件 1.在Web Forms中,当你把一个FileUpload控件拖到设计器中,你或许没有注意到在生成的HTML中会在form标签中加入一条额外属性 enctype="multipart/form-data". 而FileUpload控件本身会生成为<i

通过HTTP协议上传文件

HTTP是很常见的协议,虽然用得很多,但对细节的了解却是很浅,这回通过向服务端上传文件信息来理解细节.网络库的选择:1.WinHTTP是windows下常用的库:2.CURL是广受喜爱的开源库.对于我来说,libcurl最大的优点是使用方便,可以把注意力更多的集中到业务层上,提高工作效率,避免重造轮子:缺点是略大(MD编译有264KB,MT编译有340KB),不像WinHTTP可以由windows操作系统集成.下边展示如何使用这两种网络库实现表单POST文件. 一.libcurl 库下载:htt

Android上传文件至服务器(转)

本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理:采用Android+Struts2技术. 一.Android端实现文件上传 1).新建一个Android项目命名为androidUpload,目录结构如下: 2).新建FormFile类,用来封装文件信息 package com.ljq.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExce

asp无惧上传类2.2上传文件的同时,通过 Request.QueryString将参数传递到保存页面中

先转一段文字,对不对再评论 在后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易.但是如果 需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取.BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的 是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或  Request.QueryString 集合了.结合Request对象的TotalBytes属性,可以将 所有表单提交的数据全部变成二进制,不过

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

转自:http://www.97world.com/archives/2963 之前遇到一个问题,就是使用WebClient上传文件的同时,还要Post表单数据字段,一开始以为WebClient可以直接做到,结果发现如果先Post表单字段,就只能获取到字段及其值,如果先上传文件,也只能获取到上传文件的内容.测试了不少时间才发现WebClient不能这么使用. Google到相关的解决思路和类,因为发现网上的一些文章不是介绍得太简单就是太复杂,所以这里简单整理一下,既能帮助自己巩固知识,也希望能够

上传文件的表单

1.使用Apache 的 Commons FileUpload FileUpload下载地址: http://commons.apache.org/fileupload/ 下载:commons-fileupload-1.2.2-bin.zip    得到:commons-fileupload-1.2.2.jar http://commons.apache.org/io/ 下载:commons-io-1.4-bin.zip       得到:commons-io-1.4.jar 2.web.xml