gpt4 book ai didi

Delphi - 使用 TIdMultipartFormDataStream idHTTP 上传文件

转载 作者:行者123 更新时间:2023-12-01 22:38:52 25 4
gpt4 key购买 nike

我正在尝试使用 TIdHTTP 上传文件。问题是当请求发送到服务器时访问 token 会发生更改。

我使用的访问 token 是fJNhDM6TlcpeVmD8h3jFuPJS71sxwZB8bZBXajTRB5TNAcRa6PNXfv4J7mPxIvMdMhjy7oKdTLbsRYthpBCCqGVkj4vlojJ4BRBkLAVIBJ1DZAnMZD

API 返回

HTTP/1.1 400 错误请求
OAuth“invalid_token”“格式错误的访问 token fJNhDM6TlcpeVmD8h3jFu=\r\nPJS71sxwZB8bZBXajTRB5TNAcRa6PNXfv4J7mPxIvMdMhjy7oKdTLbsRYthpBCCqGVkj4v=\r\nlojJ4BRBkLAVIBJ1DZAnMZD”

=\r\n 添加到我的 token 中两次。

我的代码是:

function TFoo.Post(const AToken, guID, AMessage, AImageFileName: string): Boolean;
var
lParam : TIdMultipartFormDataStream;
begin
Result := False;
if not FileExists(AImageFileName) then begin
LastError := 'File not found ' + AImageFileName;
Exit;
end;
ProxyCheck;
lParam := TIdMultipartFormDataStream.Create;
try
lParam.AddFormField('message', AMessage);
lParam.AddFormField('access_token', AToken);
lParam.AddFile('source', AImageFileName);
idHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
try
idHTTP.Post( UrlAPI + guID + '/photos', lParam);
Result := True;
except;
LastError := idHTTP.ResponseText + sLineBreak + idHTTP.Response.WWWAuthenticate.Text;
end;
finally
lParam.Free;
end;
end;

我在这里缺少什么?

最佳答案

默认情况下,AddFormField()TIdFormDataField.ContentTransfer 属性设置为 MIME 的 quoted-printable 格式。这就是额外的 =\r\n 的来源。这是一个“软”换行符,由 quoted-printable 每 76 个字符插入一次。任何支持 quoted-printable 的服务器都会在解码过程中删除“软”换行符。但也许你的服务器没有。

如果您想禁用 quoted-printable 行为,可以将 ContentTransfer 属性设置为:

  1. 空白字符串:

    lParam.AddFormField('access_token', AToken).ContentTransfer := '';
  2. '7bit'(因为它不包含任何非 ASCII 字符):

    lParam.AddFormField('access_token', AToken).ContentTransfer := '7bit';
  3. '8bit'二进制:

    lParam.AddFormField('access_token', AToken).ContentTransfer := '8bit';

    lParam.AddFormField('access_token', AToken).ContentTransfer := 'binary';

在这种情况下,我建议#1。

顺便说一句,发布 TIdMultipartFormDataStream 时不要设置 HTTP 内容类型。您不仅一开始就使用了错误的媒体类型(应该是 multipart/form-data),而且 TIdMultipartFormDataStream 版本的 Post() 无论如何都会简单地覆盖它。

function TFoo.Post(const AToken, guID, AMessage, AImageFileName: string): Boolean;
var
lParam : TIdMultipartFormDataStream;
begin
Result := False;
if not FileExists(AImageFileName) then begin
LastError := 'File not found ' + AImageFileName;
Exit;
end;
ProxyCheck;
lParam := TIdMultipartFormDataStream.Create;
try
lParam.AddFormField('message', AMessage);
lParam.AddFormField('access_token', AToken).ContentTransfer := '';
lParam.AddFile('source', AImageFileName);
try
idHTTP.Post(UrlAPI + guID + '/photos', lParam);
Result := True;
except;
LastError := idHTTP.ResponseText + sLineBreak + idHTTP.Response.WWWAuthenticate.Text;
end;
finally
lParam.Free;
end;
end;

关于Delphi - 使用 TIdMultipartFormDataStream idHTTP 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711022/

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