使用基于curl调用的IdHTTP将文件上传到指定主机

问题描述 投票:0回答:1

我正在尝试创建需要将文件上传到给定主机的FMX And​​roid应用程序。

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

curl -T http://<ip-address>:<port> file.txt

当从Windows命令提示符处调用时,它会产生以下输出(IP和端口已编辑):

*   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

并且文件在主机上的预期目录中可见。

现在我正在尝试使用Indy进行相同的行为,但是要么在服务器端发生了一些黑盒魔术,要么我的代码出现了问题-使用某些解决方案,请求似乎最终确定了,但是指定的目录中没有文件(并且返回状态码200)。

[我也尝试过使用Fiddler来重现curl调用,并且在一个组合查询的响应中也收到了200个状态码,但仍然-没有正确上传文件。

[检查Wireshark数据包中的这些解决方案时,它们似乎都与curl调用类似-但是,我不是使用此工具的专家,所以也许有些问题对我的新手来说是看不到的。

我尝试使用以下解决方案:-How do I upload a file using http post? Delphi 2009-但使用PUT而不是POST-Single file upload example-Post a file through https using indy / delphi components

而且就我而言,它们不起作用-所以我的猜测是服务器某种程度上不接受这些。

我知道很难说出我在做错什么,而无需我实际输入一些代码,但是现在这完全是一团糟-但是也许不难以某种方式向我展示如何转换curl以便与[C0 ]?

如果没有,我将尝试通过更多信息来修改我的问题。

EDIT:根据要求,我添加了一些示例代码:

TIdHttp
delphi curl firemonkey indy
1个回答
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; ,因为您不使用它。您可以在该参数中传递TStringStream

此外,即使TStream(nil)返回false,您也无条件调用FHTTP.Put()。>

此外,请确保传递给OpenDialog.Execute()的URL是FHTTP.Put()而不是'http://<ip-address>:<port>/file.txt'

© www.soinside.com 2019 - 2024. All rights reserved.