Delphi发送json +文件

ant*_*kas 1 delphi post json file

我是delphi的新手,我需要通过单个http post方法发送json字符串加上一些额外的文件,我应该怎么做呢?我可以使用一个有效的解决方案,但由于我使用TIdHTTP类,发送的json测试中断,并且变得无法使用,我该如何处理这个问题?

// Keiciam failu pavadinimus
if form1.ComboBox10.ItemIndex > 0 then
CopyFile(Pchar(form1.appdatadirStr + 'temp\Automatictmp.pdf'), Pchar(form1.appdatadirStr + 'temp\auto_' + OfferNumber + '.pdf'), true);
CopyFile(Pchar(form1.appdatadirStr + 'temp\vistmp.pdf'), Pchar(form1.appdatadirStr + 'temp\full_' + OfferNumber + '.pdf'), true);
CopyFile(Pchar(form1.appdatadirStr + 'temp\tmp.pdf'), Pchar(form1.appdatadirStr + 'temp\tech_' + OfferNumber + '.pdf'), true);
CopyFile(Pchar(form1.appdatadirStr + 'temp\' + uniquetmpfile + '.ini'), Pchar(form1.appdatadirStr + 'temp\vmss_' + OfferNumber + extension), true);
try
if form1.ComboBox10.ItemIndex > 0 then
filaspdf.AddFile('Automatic', form1.appdatadirStr + 'temp\auto_' + OfferNumber + '.pdf', 'multipart/form-data');
filaspdf.AddFile('AllFile', form1.appdatadirStr + 'temp\full_' + OfferNumber + '.pdf', 'multipart/form-data');
filaspdf.AddFile('UserFile', form1.appdatadirStr + 'temp\tech_' + OfferNumber + '.pdf', 'multipart/form-data');
filaspdf.AddFile('MainFile', form1.appdatadirStr + 'temp\vmss_' + OfferNumber + extension, 'multipart/form-data');
filaspdf.AddFormField('JSON',IvestiniaiJSON);
finally
IdHTTP.Post('http://prgcc.salda.lt/ventmaster_input', filaspdf); // Siunciam i WEB;
end;
filaspdf.Free;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 5

默认情况下,AddFormField()使用MIME的quoted-printable传输格式对字符串数据进行编码.有些服务器不支持.您可以TIdFormDataField.ContentTransfer根据需要设置属性来禁用它:

filaspdf.AddFormField('JSON',IvestiniaiJSON).ContentTransfer := '';
Run Code Online (Sandbox Code Playgroud)

需要注意的是默认的内容类型AddFormField()text/plain.application/json相反,JSON的正确内容类型是:

with filaspdf.AddFormField('JSON',IvestiniaiJSON) do
begin
  ContentType := 'application/json';
  Charset := 'utf-8';
  ContentTransfer := '';
end;
Run Code Online (Sandbox Code Playgroud)

某些服务器根本不接受在文本字段上指定的内容类型.您可以根据需要禁用内容类型:

with filaspdf.AddFormField('JSON',IvestiniaiJSON) do
begin
  ContentType := ' '; // note the space character
  ContentTransfer := '';
end;
Run Code Online (Sandbox Code Playgroud)

需要空格是因为application/octet-stream如果指定空字符串,则内容类型将设置为,但如果属性设置器解析空字符串,则将设置为空.

话虽如此,您在调用时指定了错误的内容类型AddFile(). multipart/form-data不是有效的内容类型,而是一种处置,并TIdMultipartFormDtaStream在内部为您处理.您需要为文件本身指定正确的内容类型:

filaspdf.AddFile('Automatic', form1.appdatadirStr + 'temp\auto_' + OfferNumber + '.pdf', 'application/pdf');
Run Code Online (Sandbox Code Playgroud)

或者,让我们AddFile()根据文件扩展名确定您的内容类型:

filaspdf.AddFile('Automatic', form1.appdatadirStr + 'temp\auto_' + OfferNumber + '.pdf');
Run Code Online (Sandbox Code Playgroud)