Delphi 基于curl调用,使用IdHTTP将文件上载到指定主机

Delphi 基于curl调用,使用IdHTTP将文件上载到指定主机,delphi,curl,firemonkey,indy,Delphi,Curl,Firemonkey,Indy,我试图创建一个FMX Android应用程序,需要上传一个文件到给定的主机 主机所有者向我提供了以下curl语句以上载文件: curl -T http://<ip-address>:<port> file.txt 您不需要TStringStream,因为您不使用它。您可以在该参数中传递TStreamnil 此外,您正在无条件地调用FHTTP.Put,即使OpenDialog.Execute返回false 另外,请确保传递给FHTTP.Put的URL是“http://:/

我试图创建一个FMX Android应用程序,需要上传一个文件到给定的主机

主机所有者向我提供了以下curl语句以上载文件:

curl -T http://<ip-address>:<port> file.txt
您不需要TStringStream,因为您不使用它。您可以在该参数中传递TStreamnil

此外,您正在无条件地调用FHTTP.Put,即使OpenDialog.Execute返回false


另外,请确保传递给FHTTP.Put的URL是“http://:/file.txt”而不是“http://:”

还考虑设置FHTTP.Rest.UsAgent,因为一些Web服务器拒绝Indy的默认用户代理。

还要考虑对对象进行免费处理,特别是如果您计划升级到10.4悉尼或更高版本,因为对象寿命管理的ARC在10.4被删除。 尝试类似以下内容:

变量 FHTTP:TIdHTTP; file2send:string; FPutData:TFileStream; 开始 如果没有打开Dialog1.执行然后退出; file2send:=OpenDialog1.FileName; FHTTP:=TIdHTTP.Createnil; 尝试 FHTTP.Request.UserAgent:=“curl/7.55.1”; FPutData:=TFileStream.Createfile2send、fmOpenRead或fmShareDenyWrite; 尝试 FHTTP.putURL.Text、FPutData、TStreamnil; {或者,可能类似于: URL:=PutURL.Text+'/'+ExtractFileNamefile2send; FHTTP.PutURL、FPutData、TStreamnil; } 最后 FPutData.Free; 终止 最后 FHTTP.免费; 终止 终止 您不需要TStringStream,因为您不使用它。您可以在该参数中传递TStreamnil

此外,您正在无条件地调用FHTTP.Put,即使OpenDialog.Execute返回false


另外,请确保传递给FHTTP.Put的URL是“http://:/file.txt”而不是“http://:”

还考虑设置FHTTP.Rest.UsAgent,因为一些Web服务器拒绝Indy的默认用户代理。

还要考虑对对象进行免费处理,特别是如果您计划升级到10.4悉尼或更高版本,因为对象寿命管理的ARC在10.4被删除。 尝试类似以下内容:

变量 FHTTP:TIdHTTP; file2send:string; FPutData:TFileStream; 开始 如果没有打开Dialog1.执行然后退出; file2send:=OpenDialog1.FileName; FHTTP:=TIdHTTP.Createnil; 尝试 FHTTP.Request.UserAgent:=“curl/7.55.1”; FPutData:=TFileStream.Createfile2send、fmOpenRead或fmShareDenyWrite; 尝试 FHTTP.putURL.Text、FPutData、TStreamnil; {或者,可能类似于: URL:=PutURL.Text+'/'+ExtractFileNamefile2send; FHTTP.PutURL、FPutData、TStreamnil; } 最后 FPutData.Free; 终止 最后 FHTTP.免费; 终止 终止
请显示您遇到问题的实际代码。您展示的curl命令非常容易使用TIdHTTP.Put和TFileStream进行复制。但是,如果你甚至不能用Fiddler而不是Indy生成一个有效的结果,那么服务器端就有可能出现问题。根据请求,我添加了一些示例代码。您能验证我是否正确使用Indy和FileStream吗?请显示您遇到问题的实际代码。您展示的curl命令非常容易使用TIdHTTP.Put和TFileStream进行复制。但是,如果你甚至不能用Fiddler而不是Indy生成一个有效的结果,那么服务器端就有可能出现问题。根据请求,我添加了一些示例代码。您能验证我是否正确使用了Indy和FileStream吗?另外,请确保传递给FHTTP.Put的URL是“http://:/file.txt”而不是“http://:”。另外,请确保传递给FHTTP.Put的URL是“http://:/file.txt”而不是“http://:”。
*   Trying <ip-address>...
* TCP_NODELAY set
* Connected to <ip-address> (<ip-address>) port <port> (#0)
> PUT /file.txt HTTP/1.1
> Host: <ip-address>:<port>
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Length: 682
> Expect: 100-continue
>
* Done waiting for 100-continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< content-length: 0
< date: Tue, 16 Jun 2020 19:24:18 GMT
< connection: close
<
* Closing connection 0
var
  FHTTP: TIdHTTP;
  file2send: string;
  sr: TStringStream;
  FPutData : TFileStream;
begin
  sr := TStringStream.Create;
  if OpenDialog1.Execute then
    file2send := OpenDialog1.FileName;

  FHTTP := TIdHTTP.Create(self);
  FPutData := TFileStream.Create(file2send, fmOpenRead or
    fmShareDenyWrite);
  FHTTP.Put(PutURL.text, FPutData, sr);

end;