[英]Indy 10 + XE8 multipart upload with long filename
我正在嘗試使用TIdMultipartFormDataStream進行多部分上傳到 Box.com。 雖然文件名最多為'\\ u0424 \\ u042B \\ u0412 \\ u0410 \\ u041F.txt'但它可以正常工作,但是當它更長時('\\ u0424 \\ u042B \\ u0412 \\ u0410 \\ u040F \\ u0420.txt')它會導致'HTTP' /1.1 400 Bad Request'。
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
屬性,你可以將它設置為8bit
或binary
以便按原樣發送JSON文本(在charset編碼為字節后,即):
MD.AddFormField('metadata', '{"name": "ФЫВАПР.txt", "parent": {"id": "0"}}', 'utf-8', 'application/json').ContentTransfer := '8bit';
或者,將您的JSON放在TStream
,如TStringStream
或TMemoryStream
,然后使用AddFormField()
的TStream
重載,默認情況下將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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.