gpt4 book ai didi

delphi - Indy 10 + XE8 长文件名分段上传

转载 作者:行者123 更新时间:2023-12-01 18:10:54 25 4
gpt4 key购买 nike

我正在尝试做multipart upload to Box.com使用 TIdMultipartFormDataStream。虽然文件名最大为“\u0424\u042B\u0412\u0410\u041F.txt”,但它工作正常,但是当它更长时(“\u0424\u042B\u0412\u0410\u041F\u0420.txt”),它会导致“HTTP”/1.1 400 错误请求'。

FormField.FFieldValue 长度有限制吗?如果是这样,有什么办法可以绕过它吗?

procedure TBoxComSaveFilter.UploadTest;
const
URL = 'https://upload.box.com/api/2.0/files/content';
var
IdHTTP: TIdHTTP;
MD: TIdMultipartFormDataStream;
begin
IdHTTP := TIdHTTP.Create(nil);
try
IdHTTP.HandleRedirects := True;
IdHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdHTTP.Request.BasicAuthentication := False;
IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + FAccessToken;
MD := TIdMultipartFormDataStream.Create;
try
MD.AddFormField('metadata', '{"name": "' +
'\u0424\u042B\u0412\u0410\u041F.txt' + // => OK
// '\u0424\u042B\u0412\u0410\u041F\u0420.txt' + // => 400 Bad Request
'", "parent": {"id": "0"}}', '', 'application/json');

MD.AddFile('content', 'source.txt', 'application/octet-stream');
IdHTTP.Post(URL, MD);
finally
MD.Free;
end;
finally
IdHTTP.Free;
end;
end;

短文件名的部分日志:

Sent 20.02.2017 21:16:26: ----------022017211625520
Content-Disposition: form-data; name="metadata"
Content-Type: application/json
Content-Transfer-Encoding: quoted-printable

{"name": "\u0424\u042B\u0412\u0410\u041F.txt", "parent": {"id": "0"}}
----------022017211625520

长文件名的相同部分:

Sent 20.02.2017 21:17:48: ----------022017211748412
Content-Disposition: form-data; name="metadata"
Content-Type: application/json
Content-Transfer-Encoding: quoted-printable

{"name": "\u0424\u042B\u0412\u0410\u041F\u0420.txt", "parent": {"id": =
"0"}}
----------022017211748412

正如我所见,数据在 70 字节后被“=CRLF”分割。

最佳答案

文本字段的默认传输编码是 MIME 的 quoted-printable 格式。 Box 似乎不喜欢这种格式。

AddFormField() 返回一个 TIdFormDataField,它有一个 ContentTransfer 属性,您可以将其设置为 8bitbinary 按原样发送 JSON 文本(即在将字符集编码为字节之后):

MD.AddFormField('metadata', '{"name": "ФЫВАПР.txt", "parent": {"id": "0"}}', 'utf-8', 'application/json').ContentTransfer := '8bit';

或者,将 JSON 放入 TStream 中,例如 TStringStreamTMemoryStream,然后使用 TStream AddFormField() 的重载,默认情况下将 ContentTransfer 设置为 binary:

JsonStream := TStringStream.Create('{"name": "ФЫВАПР.txt", "parent": {"id": "0"}}', TEncoding.UTF8);
try
MD.AddFormField('metadata', 'application/json', 'utf-8', JsonStream);
// send the post...
finally
JsonStream.Free;
end;

关于delphi - Indy 10 + XE8 长文件名分段上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42350594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com