Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 使用PUT上载带有TIDWTTP的文件_Delphi_Indy_Transifex - Fatal编程技术网

Delphi 使用PUT上载带有TIDWTTP的文件

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

我想用PUT on TIDHTTP上传一个文件。我从Remy Lebeau那里找到了一个答案,他说不要使用PUT,而是使用POST

但是,在我的例子中,我不能这样做,因为我使用的是第三个API,它指定我需要使用PUT。如果我尝试使用POST,它会返回一条消息,告诉我该方法是不允许的

基本上,我正在尝试这样做:

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,你又手动设置了边界…哦,对不起!我没看见。创建一个答案,我会接受它!