我正在尝试创建需要将文件上传到给定主机的FMX Android应用程序。
主机所有者向我提供了以下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
您不需要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'
。