使用Delphi Indy HTTP组件上载带有表单数据的文件

使用Delphi Indy HTTP组件上载带有表单数据的文件,http,delphi,file-upload,indy,form-data,Http,Delphi,File Upload,Indy,Form Data,我想使用Indy在Delphi中复制这部分Python代码: postdata={'data':{“data”:{“xMode”:0,“overrideOS”:1,“messageId”:“vmProfileList”:“11”,“submitType”:“0”,“url”:“}”,filePriorityQ:“立即运行”} 文件_up={'amas_filename':打开('/home/samples/temp/vtest32.exe','r')} file\u upload\u req=r

我想使用Indy在Delphi中复制这部分Python代码:

postdata={'data':{“data”:{“xMode”:0,“overrideOS”:1,“messageId”:“vmProfileList”:“11”,“submitType”:“0”,“url”:“}”,filePriorityQ:“立即运行”}
文件_up={'amas_filename':打开('/home/samples/temp/vtest32.exe','r')}
file\u upload\u req=requests.post(url、postdata、files=file\u up、headers=headers、verify=False)
我这样试过:

Params.AddFormField('data','{“data”):{“xMode”:“+xMode+”,“analyzereach”:1,“overrideOS”:1,'+
““vmProfileList”:“+DBProfileID.Value+”,“submitType”:0,“url”:“}”);
Params.AddFile('amas_filename',DBTestFilePath.Value,GetMIMEType(DBTestFilePath.Value));
参数位置:=0;
HTTP1.Request.ContentType:=“application/x-www-form-urlencoded”;
JSON:=HTTP1.Post(URL,参数);
但它给了我一个HTTP错误“HTTP/1.0 400坏请求”,Web服务器说“坏请求。检查输入数据和负载大小”。我知道数据量足够小

这是来自客户端的请求和来自服务器的响应:

客户方说

POST /php/fileupload.php HTTP/1.0
Content-Type: multipart/form-data; boundary=--------031317093926335
Content-Length: 248815
VE-SDK-API: <<APIKEYWasHere>>
Host: Server_IP
Accept: application/vnd.ve.v1.0+json
Accept-Encoding: identity
User-Agent: Mozilla/3.0 - NBL
Cookie: PHPSESSID=<<Cookie_Was_Here>>

----------031317093926335
Content-Disposition: form-data; name="data"
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

{"data":{"xMode": 0,"analyzeAgain":1,"overrideOS":1,"vmProfileList":"2=
4","submitType":0,"url":""},"filePriorityQ":"run_now"}
----------031317093926335
Content-Disposition: form-data; name="amas_filename"; filename="Process.exe"
Content-Type: application/x-msdownload
Content-Transfer-Encoding: binary

MZP
<<FileDataWasHere>>
POST/php/fileupload.php HTTP/1.0
内容类型:多部分/表单数据;边界=-----------031317093926335
内容长度:248815
VE-SDK-API:
主机:服务器IP
接受:application/vnd.ve.v1.0+json
接受编码:标识
用户代理:Mozilla/3.0-NBL
饼干:PHPSESSID=
----------031317093926335
内容配置:表单数据;name=“数据”
内容类型:文本/纯文本
内容传输编码:引用可打印
{“数据”:{“xMode”:0,“analyzereach”:1,“overrideOS”:1,“vmProfileList”:“2”=
4、“submitType”:0,“url:”},“filePriorityQ:“立即运行”}
----------031317093926335
内容配置:表单数据;name=“amas_filename”;filename=“Process.exe”
内容类型:应用程序/x-msdownload
内容传输编码:二进制
MZP
服务器服务说

HTTP/1.0 400 Bad Request
X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
Cache-Control: no-store, no-cache, must-revalidate, private,max-age=0
Cache-Control: no-store, no-cache, must-revalidate, private,max-age=0
Pragma: no-cache
Pragma: no-cache
Expires: Sat, 26 Jul 1997 05:00:00 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 89
Connection: close
Date: Mon, 13 Mar 2017 06:39:19 GMT
Server: Server FIPS

{"success":false,"errorMessage":"Bad Request. Check input data and payload size(<=200M)"}
HTTP/1.0 400错误请求
X-Content-Type-Options:nosniff
X-Content-Type-Options:nosniff
缓存控制:无存储,无缓存,必须重新验证,私有,最大年龄=0
缓存控制:无存储,无缓存,必须重新验证,私有,最大年龄=0
Pragma:没有缓存
Pragma:没有缓存
到期时间:1997年7月26日星期六格林尼治标准时间05:00:00
内容类型:text/html;字符集=UTF-8
内容长度:89
连接:关闭
日期:2017年3月13日星期一06:39:19 GMT
服务器:服务器FIPS

{“success”:false,“errorMessage”:“请求不正确。请检查输入数据和有效负载大小(下次您在与其他人的API交互时遇到问题,您应该指出该API的实际情况,以便人们有机会查看其文档,查看是否有任何内容丢失或错误。在这种情况下,您似乎正在使用

在您所显示的HTTP请求中,有几件事值得我注意:

  • HTTP1.Request.ContentType:=“应用程序/x-www-form-urlencoded”;

    这完全是错误的。正确的内容类型是
    multipart/form data
    。但是,
    TIdHTTP
    在发布
    TIdMultipartFormDataStream
    时会为您处理此问题,因此您不需要为
    请求分配值。ContentType
    属性根本不会覆盖它。Bu但这并不能改变代码中存在bug的事实

  • 接受编码:标识

    这表明您正在使用一个旧版本的Indy。您应该考虑升级到一个更新近的版本。<代码> TIdHTTP <代码>不再在<代码>接受编码< /代码>请求头中发送<代码>身份> <代码>,除非<代码> TIDHTTP.Realth.Access编码属性包含其他值,这不是她的情况。e、 某些服务器在处理请求中明确声明的

    接受编码:identity
    时遇到问题,这就是默认情况下不再发送的原因

  • 内容类型:文本/纯文本

    JSON字段的
    内容类型应为
    application/JSON
    ,或者在此API中甚至可能是
    application/vnd.ve.v1.0+JSON
    。如果未另行指定,默认值为
    text/plain
    AddFormField()
    有一个用于此目的的
    aconttype
    参数。web服务器可能对该值敏感。JSON通常也使用UTF-8编码,因此您也应该指出这一点。
    AddFormField()
    有一个用于此目的的
    ACharset
    参数

  • 内容传输编码:引用可打印的

    您的JSON字符串正在使用
    quoted printable
    进行编码,这通常适用于MIME中的文本内容,但并非所有web服务器都在webform提交中处理该字符串,并且它可能不适用于非
    text/…
    媒体类型,如JSON。
    AddFormField()
    返回一个
    TIdFormDataField
    对象。要禁用QP编码,可以将
    TIdFormDataField.ContentTransfer
    属性设置为
    8bit
    binary

  • 话虽如此,还是尝试一下类似的方法:

    Params.AddFormField('data','{“data”):{“xMode”:“+xMode+”,“analyzereach”:1,“overrideOS”:1,'+
    ““vmProfileList”:“+DBProfileID.Value+”,“submitType”:0,“url”:“}}”,
    ‘utf-8’,
    “应用程序/json”
    ).ContentTransfer:=“8位”;
    //使用GetMIMEType()指定ContentType是多余的,因为
    //AddFile()已经使用Indy自己的在内部为您完成了这项工作
    //GetMIMETypeFromFile()函数。。。
    Params.AddFile('amas_filename',DBTestFilePath.Value);
    JSON:=HTTP1.Post(URL,参数);
    

    如果这对您仍然不起作用,我建议您直接联系McAfee以获得进一步帮助。

    最好使用
    TIdMultipartFormDataStream
    进行表单上载,请查看我的答案。@代码显然已经在使用
    TIdMultipartFormDataStream
    ,因为它正在调用
    AddFor