Delphi 使用PUT上载带有TIDWTTP的文件
我想用PUT on TIDHTTP上传一个文件。我从Remy Lebeau那里找到了一个答案,他说不要使用PUT,而是使用POST 但是,在我的例子中,我不能这样做,因为我使用的是第三个API,它指定我需要使用PUT。如果我尝试使用POST,它会返回一条消息,告诉我该方法是不允许的 基本上,我正在尝试这样做:Delphi 使用PUT上载带有TIDWTTP的文件,delphi,indy,transifex,Delphi,Indy,Transifex,我想用PUT on TIDHTTP上传一个文件。我从Remy Lebeau那里找到了一个答案,他说不要使用PUT,而是使用POST 但是,在我的例子中,我不能这样做,因为我使用的是第三个API,它指定我需要使用PUT。如果我尝试使用POST,它会返回一条消息,告诉我该方法是不允许的 基本上,我正在尝试这样做: Response := TStringStream.Create; DS := TIdMultiPartFormDataStream.Create; DS.AddFile('fileUpl
Response := TStringStream.Create;
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
FHttpComunication.Request.ContentType := 'multipart/form-data';
FHttpComunication.Put(UrlCmd, DS, Response);
但是当我这样做时,我得到一个500内部服务器错误
如果我删除以下内容:
FHttpComunication.Request.ContentType := 'multipart/form-data';
我收到400个错误的请求
我已经尝试过直接从浏览器高级REST客户端chrome执行请求,它可以正常工作。因此,API正在工作。消息工作时的标题为:
PUT /api/2/project/XXXXXXXX/resource/export1po/translation/en/ HTTP/1.1
HOST: www.XXXXXXXXXXXXX.com
authorization: Basic XXXXXXXXXXXXX
content-type: multipart/form-data; boundary=----WebKitFormBoundaryPWT8bUdkQ1ZVLHdL
accept: application/json
accept-encoding: gzip, deflate
accept-language: en-US,en;q=0.8
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
content-length: 1936
------WebKitFormBoundaryPWT8bUdkQ1ZVLHdL
Content-Disposition: form-data; name="fileUpload2"; filename="teste.po"
Content-Type: application/octet-stream
2答案中建议的方式,但不起作用。我也得到了错误500
那个API被设计破坏了。您不应该混合使用多部分/表单数据和PUT。你应该这样寄
FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite);
FHTTP.Put('http://...', FPutData, FResponseStream);
FHTTP.Request.ContentType:=DS.RequestContentType;
但如果它不起作用,问题可能是您没有设置正确的ContentType,它不包括边界。像这样修理它
FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite);
FHTTP.Put('http://...', FPutData, FResponseStream);
FHTTP.Request.ContentType:=DS.RequestContentType;
其中DS是您的TIdMultiPartFormDataStream。该API被设计破坏。您不应该混合使用多部分/表单数据和PUT。你应该这样寄
FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite);
FHTTP.Put('http://...', FPutData, FResponseStream);
FHTTP.Request.ContentType:=DS.RequestContentType;
但如果它不起作用,问题可能是您没有设置正确的ContentType,它不包括边界。像这样修理它
FPutData:=TFileStream.Create('yourfile.dat', fmOpenRead or fmShareDenyWrite);
FHTTP.Put('http://...', FPutData, FResponseStream);
FHTTP.Request.ContentType:=DS.RequestContentType;
其中DS是您的TIdMultiPartFormDataStream。我发现了问题。这是我必须设定的边界。因此,最终结果是:
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
try
FHttpComunication.Request.ContentType := 'multipart/form-data; boundary=' + DS.Boundary;
FHttpComunication.Request.AcceptEncoding := '';
FHttpComunication.Request.Accept := '';
FHttpComunication.Request.Host := '';
FHttpComunication.Request.UserAgent := '';
FHttpComunication.Put(UrlCmd, DS, Response);
finally
DS.Free;
Response.Free;
end;
我发现了问题。这是我必须设定的边界。因此,最终结果是:
DS := TIdMultiPartFormDataStream.Create;
DS.AddFile('fileUpload2', 'C:\Users\r.rezino\Desktop\teste.po', 'application/octet-stream');
try
FHttpComunication.Request.ContentType := 'multipart/form-data; boundary=' + DS.Boundary;
FHttpComunication.Request.AcceptEncoding := '';
FHttpComunication.Request.Accept := '';
FHttpComunication.Request.Host := '';
FHttpComunication.Request.UserAgent := '';
FHttpComunication.Put(UrlCmd, DS, Response);
finally
DS.Free;
Response.Free;
end;
TIdMultipartFormDataStream旨在与Post一起使用,该版本的Post在内部设置ContentType,并带有边界。如果您放置了一个TIdMultipartFormDataStream,那么是的,您必须手动设置ContentType,并且应该使用RequestContentType。它不起作用!我仍然收到不好的请求。我两次都试过了。关于question.TIdMultipartFormDataStream的更多信息是用于Post的,该版本的Post在内部设置了ContentType,并带有边界。如果您放置了一个TIdMultipartFormDataStream,那么是的,您必须手动设置ContentType,并且应该使用RequestContentType。它不起作用!我仍然收到不好的请求。我两次都试过了。我想了解更多关于这个问题的信息。请提供您设置的所有标题的完整代码。AddFile过程中的最后一个参数应该是application/octet stream。如果不使用TIdMultiPartFormDataStream,请不要手动设置ContentType。否则,请使用我提到的RequestContentType函数。从TIdHTTP.Request.RawHeaders.Text保存标题,或使用OnIdHTTPHeadersAvailable事件并比较标题。如果您发送完全相同的请求,它必须工作。请提供包含您设置的所有标题的完整代码。AddFile过程中的最后一个参数应该是application/octet stream。如果不使用TIdMultiPartFormDataStream,请不要手动设置ContentType。否则,请使用我提到的RequestContentType函数。从TIdHTTP.Request.RawHeaders.Text保存标题,或使用OnIdHTTPHeadersAvailable事件并比较标题。如果你发送了完全相同的请求,它一定会起作用。真是个惊喜!我昨天告诉过你使用RequestContentType,你又手动设置了边界…哦,对不起!我没看见。创建一个答案,我会接受它!真是个惊喜!我昨天告诉过你使用RequestContentType,你又手动设置了边界…哦,对不起!我没看见。创建一个答案,我会接受它!