Имеется на одном сайте API для передачи файла ZIP (так осуществляется сбор информации о мед.обследованиях)
На одном и том же файле делаю тесттовую отправку через ARC client и через нашу программу.
При отправке файла нужно так же отправить хэш файла.
Хэш файла получаю в нашей программе, вставляю его в заголовок в ARC, файл уходит и в ответ получаю подтверждение, что он принят.
Когда я его же с этим же хэшом отправляю в программе, в ответ получаю ошибку "<message>Хэш-сумма загруженного файла не совпадает с ожидаемой. Возможно файл был загружен не полностью.</message>"
Получается сам метод отправки "не тот".
Как понять причину?
- Код: Выделить всё
- var FileHash, filename, url:string;
 IdHTTP_Put: TidHTTP;
 sResp: RawByteString;
 STRM: TIdMultiPartFormDataStream;
 begin
 url:='https://......';
 filename:= 'D:testtest01.zip';
 FileHash := MD5Print(MD5File(filename));
 FileHash := TIdEncoderMIME.EncodeString(FileHash);
 
 IdHTTP_Put:=TidHTTP.Create(nil);
 IdHTTP_Put.IOHandler:=TIdSSLIOHandlerSocketOpenSSL.Create(nil);
 TIdSSLIOHandlerSocketOpenSSL(IdHTTP_Put.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
 TIdSSLIOHandlerSocketOpenSSL(IdHTTP_Put.IOHandler).SSLOptions.Method := sslvTLSv1_2;
 IdHTTP_Put.Request.CustomHeaders.AddValue('Authorization', 'Bearer '+token );
 IdHTTP_Put.Request.CustomHeaders.AddValue('Content-MD5', FileHash );
 IdHTTP_Put.Request.UserAgent:='Mozilla/3.0 (compatible; Indy Library)';
 IdHTTP_Put.Request.ContentType:='application/x-zip-compressed';
 IdHTTP_Put.Request.Charset:='utf-8';
 IdHTTP_Put.Request.ContentLength:=1;
 IdHTTP_Put.HTTPOptions:=[hoForceEncodeParams,hoWaitForUnexpectedData,hoWantProtocolErrorContent, hoNoProtocolErrorException];
 STRM := TIdMultiPartFormDataStream.Create;
 STRM.AddFile('file', filename, 'application/x-zip-compressed'); //'application/octet-stream' // 'application/x-zip-compressed'
 STRM.Position:=0;
 sResp:= IdHTTP_Put.Put(url, STRM, IndyTextEncoding_UTF8 );
 
 STRM.Free;
 IdHTTP_Put.Disconnect;
 IdHTTP_Put.Free;
 end;
В логе программы
- Код: Выделить всё
- ---request PUT
 https://.......
 D:testtest01.zip
 Content-MD5=OTM1NWE5MDc0ZTE1MjMxYTM3Yjg0ZGFmNTZkNTQ0ZDQ=
 response Headers
 Content-Length: 19979
 Authorization: Bearer ZX.....jA=
 Content-MD5: OTM1NWE5MDc0ZTE1MjMxYTM3Yjg0ZGFmNTZkNTQ0ZDQ=
 Host: .....ru
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 User-Agent: Mozilla/3.0 (compatible; Indy Library)
 ---response PUT
 ResponseCode=400
 Body
 <?xml version="1.0" encoding="UTF-8"?>
 <Error>
 <code>InvalidMd5Sum</code>
 <message>Хэш-сумма загруженного файла не совпадает с ожидаемой. Возможно файл был загружен не полностью.</message>
 <requestId></requestId>
 </Error>
 response Headers
 Server: nginx
 Date: Tue, 14 Nov 2023 04:48:48 GMT
 Content-Type: application/xml; charset=UTF-8
 Content-Length: 19966
 Transfer-Encoding: chunked
 Connection: keep-alive
 Keep-Alive: timeout=15
 P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"
 X-Powered-CMS: Bitrix Site Manager (3e0207e37f595a3549e838893c4)
 Set-Cookie: PHPSESSID=9lsbtqs7aejj9d3p9; path=/; HttpOnly
 Expires: Thu, 19 Nov 1981 08:52:00 GMT
 Cache-Control: no-store, no-cache, must-revalidate
 Pragma: no-cache
Добавлено спустя 46 минут 9 секунд:
Размер контента разный
в ARC client
content-length: 19771
а в программе
Content-Length: 19966
Видимо поток формируется по разному. И в TIdMultiPartFormDataStream как-то по другому
Добавлено спустя 1 час 8 минут 1 секунду:
Хороший тут форум.
Волшебный
 
 Очень часто бьюсь над проблемой. Потом пишу вопрос, и после написания вопроса, в течении пары тройки часов нахожу решение сам.
 
 Сделал по другому формирование потока.
- Код: Выделить всё
- var STRM: TFileStream;
 ...
 begin
 ...
 STRM := TFileStream.Create(filename, fmOpenRead);
 STRM.Position:=0;
 ...
 sResp:= IdHTTP_Put.Put(url, STRM , IndyTextEncoding_UTF8 );
 ...
 end;
Вот таким способом
content-length: 19771
и сайт принимает файл



 
  