通过 HTTP,您可以在 Multipart Formdata 发布请求中发送图像。这与通过 HTML 表单上传图像时的请求相同。服务器不会知道区别。:)
上传非常容易。您创建了一个 MultipartFormDataStream,它具有添加文件的方法。然后,您可以使用 TIdHTTP 发送它。您可以在运行时创建它,但如果您安装了 Indy 组件,您也可以将其放在表单上。我做到了,并将其保留为默认名称IdHTTP1
。
在示例中,我从磁盘加载文件,但也可以直接从流加载它。我还没有尝试过,但我认为加载一个临时文件就可以了。
客户端的Delphi代码:
var
Params: TIdMultipartFormDataStream;
Response: TStringStream;
begin
try
Params := TIdMultipartFormDataStream.Create;
Response := TStringStream.Create;
try
Params.AddFile('file', 'C:\temp\YourTempImageName.jpg', 'image/jpg');
// Substiture real url below.
IdHTTP1.Post('http://localhost/uploadimage.php', Params, Response);
// For testing purposes, you may show the response.
//Memo1.Text := Response.DataString;
finally
// Free resources. Important if you want your app to keep running
// without being noticed.
Params.Free;
Response.Free;
end;
except
// Log exception for testing. Don't let it show to the 'friend'.
//on e: Exception d
// Memo1.Lines.Add(e.Message);
end;
end;
对于服务器,您可以使用任何允许保存文件的启用 PHP 的服务器。我在下面包含了最小的示例。当然你也可以用其他语言编写服务器软件,包括 Delphi。但是如果你用 Delphi 编写它,你将需要一个始终可用的 Windows 服务器。
服务器的示例 PHP 代码:
<?php
if (isset($_FILES['file']) && $_FILES['file']['error'] == UPLOAD_ERR_OK)
{
// Choose your proper directory here.
$target = 'C:\\ff\\uploads\\' . time();
$result = move_uploaded_file($_FILES['file']['tmp_name'], $target);
if (!$result) {
echo 'Cannot copy'; // This response is sent to the client.
}
}