使用多个服务器托管图像

时间:2011-08-05 19:07:31

标签: php file-upload load-balancing

我正在开发一个图像主机,并希望将图像从我的网络内容上传到单独的服务器,例如:http://i1.mysite.com而不是http://mysite.com/uploads。但是我在弄清楚如何做到这一点时遇到了一些麻烦。

说我有这样的表格:

<form action="http://mysite.com/upload" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <input type="file" name="image" id="file_upload" />
    <input type="submit" value="Upload" id="upload_submit" />
</form>

这会将图像文件发送到/upload,我可以在其中验证文件并保存,但这将与托管网站的服务器位于同一服务器上,而不是专用的存储服务器。如果没有将图像上传到与我的网站相同的服务器上,我怎样才能实现我想要的目标?

我总是这样做:

<form action="http://i1.mysite.com/upload" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <input type="file" name="image" id="file_upload" />
    <input type="submit" value="Upload" id="upload_submit" />
</form>

将图像文件发送到另一台服务器,但是当图片上传完成后,我将被重定向到http:/i1.mysite.com/upload

任何人都有这方面的经验,可以推荐一个行动方案吗?谢谢!

4 个答案:

答案 0 :(得分:1)

请勿上传到影像服务器。这些特定于内容的服务器应该针对提供内容进行优化,而不必处理消费内容。

让上传表单发送到您主站点的服务器。然后,您可以使用其他协议将上载的文件传输到映像服务器。 rsynch,scp等...这样你就可以在一个位置拥有所有“控制”代码,而不必担心在多个服务器之间同步数据库和所有数据 - 所有数据都保存在主服务器上,并且图像服务器只是被动地吐出图像数据。

答案 1 :(得分:0)

我建议将这两个想法脱钩。首先,将映像上传到您的服务器,并在单独的进程(可能是预定的cron)中将映像移动到其他服务器。您可能不希望用户等待两次上传完成。

答案 2 :(得分:0)

就像其他人所说的那样,你所做的并不是最佳的。如果您真的想继续这样做,我建议将表单提交给PHP脚本,然后处理它并将文件放在需要的位置,然后将所有信息保存到数据库中。您需要评估从一台服务器到另一台服务器的数据传输的最佳协议。您最终可能会使用Curl,您可以了解herehere以及curl docs

答案 3 :(得分:0)

您可以将图片上传到图片主机,然后将其重定向回您的网站。一种方法是在表单中添加隐藏的“成功”和“失败”URL输入:

<form action="http://i1.mysite.com/upload" method="post" accept-charset="utf-8" enctype="multipart/form-data">
    <input type="file" name="image" id="file_upload" />
    <input type="submit" value="Upload" id="upload_submit" />
    <input type="hidden" name="success" value="http://mysite.com/success" />
    <input type="hidden" name="failure" value="http://mysite.com/failure" />
</form>

成功上传后,映像主机上的上传脚本将重定向到提供的URL:

<?php
    .. handle uploaded file ..

    if ($success) {
        header ('Location: ' . $_REQUEST ['success']) ;
    }
    else {
        header ('Location: ' . $_REQUEST ['error'] . '?message=' . $message) ;
    }

?>