通过PHP API服务将图像上传到OpenFire

时间:2013-01-08 20:30:35

标签: php xml image xmpp openfire

我正在构建一个处理图片上传的PHP API。使用$ _FILES和PHP move_uploaded_file()将映像正常上传到apache服务器 - 这会在本地保存文件,现在可用于网站。我还需要在同一过程中点击XMPP服务器(OpenFire)来使用相同的图像更新头像。

我无法弄清楚如何处理这个问题,我想使用$ _FILES ['userfile'] ['tmp_name']中的文件引用从PHP tmp / location获取实际的图像文件数据 - 这个是我们使用move_uploaded_file()时访问它的方式。运行move_uploaded_file()后,tmp文件数据是否仍然可用?这个名称不是这样,今天的实验会在之前显示资源,在运行move_uploaded_file()之后会显示false。那么我怎么能点击图像数据并将其格式化以便在xml数据包中使用它,同时仍然保留原始tmp文件的完整性以用于后续的move_uploaded_file()? - 请参阅下面的xml示例。

另一种方法是使用get_file_contents()并读取我们刚刚保存到文件系统的文件 - 但这看起来很愚蠢。

下一步是我的头脑.OpenFire XMPP服务器允许分配通过XMPP接口本身。有关如何上传和设置用户头像的示例,请参阅http://xmpp.org/extensions/xep-0084.html#examples-multiple

有人请指点我这里正确的方向,我需要向开放式服务器发送一个XML(XMPP)数据包 - 我已经运行XMPPHP并连接到服务器而不用担心,它的格式是xml那个让我悲伤。

来自http://xmpp.org/extensions/xep-0084.html#examples-multiple的示例XMP数据包(示例1.将头像数据发布到数据节点)

<iq type='set' from='juliet@capulet.lit/chamber' id='publish1'>
 <pubsub xmlns='http://jabber.org/protocol/pubsub'>
<publish node='urn:xmpp:avatar:data'>
  <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
    <data xmlns='urn:xmpp:avatar:data'>
      qANQR1DBwU4DX7jmYZnncm...
    </data>
  </item>
</publish>

2 个答案:

答案 0 :(得分:1)

所以我使用xmpphp库得到了这个xmpp头像问题。我写了这个函数来启动课程:

/*
 *  arg 1: $file_handle = the local path to the image
 *  arg 2: $file_type   = the file extension, jpg, png etc.
*/

function upload_new_xmpp_avatar($file_handle, $file_type)
{
// XMPPHP class. Used to connect to xmpp server
require_once "xmpphp/XMPPHP/XMPP.php;

$xmpp_host = "xmpp.domain.com";

$xmpp_server = ""xmpp.domain.com";

$xmpp_port = "5222";

$admin_username = "admin_user";

$admin_pasword = "admin_pw";

$conn = new XMPPHP_XMPP($xmpp_host, $port, $admin_username, $admin_password, "xmpphp", $xmpp_server, $printlog = false, $loglevel = XMPPHP_Log::LEVEL_VERBOSE);

try
{
    // load the image from filesystem
    $raw_file = file_get_contents($file_handle);                                                                            

    // get the image information array, width, height etc.
    $image_info = getimagesize($file_handle);                                                                               

    // build sha1 hash of the raw image data
    $image_sha1_hash = sha1($file_handle);                                                                                  

    // base64 encode it!
    $file_data = base64_encode($raw_file);                                                                                  

    $conn->connect();

    $conn->processUntil('session_start');

    $conn->upload_new_avatar_from_file($user_r->user_name, $file_data, $image_info, $image_sha1_hash);

    $conn->disconnect();
}
catch(XMPPHP_Exception $e) 
{
    api_die("xmpp_error: ".$e->getMessage());
}

return $image_sha1_hash;

}

还需要向XMPP.php类添加新的类函数:

    // adding upload avatar option

public function upload_new_avatar_from_file($user_name, $file_data, $image_info, $image_sha1_hash)          // 08 01 2013 NM adding upload new avatar function
{
    $id = 'upload_avatar_file_' . $this->getID();

    $image_file_size = ($image_info['bits']*8);                                                             // convert bits to bytes.. dur.

    $image_mime_type = $image_info['mime'];

    $image_height = $image_info[1];                                                                         

    $image_width = $image_info[0];

    $xml = "<iq type='set' to='$user_name@$xmpp_server' id='$id'>
                <vCard xmlns='vcard-temp'>
                    <PHOTO xmlns='vcard-temp'>
                        <BINVAL xmlns='vcard-temp'>$file_data</BINVAL>
                        <TYPE xmlns='vcard-temp'>$image_mime_type</TYPE>
                    </PHOTO>
                </vCard>
            </iq>";

    // 2nd xml comand sets the uploaded image as the new vCard avatar 

    $xml2 = "<presence>
                <priority>30</priority>
                <status>Online</status>
                <x xmlns='vcard-temp:x:update'>
                  <photo>$image_sha1_hash</photo>
                </x>
                <x xmlns='jabber:x:avatar'>
                  <hash>$image_sha1_hash</hash>
                </x>
                <c xmlns='http://jabber.org/protocol/caps' node='http://vacuum-im.googlecode.com' ver='nvOfScxvX/KRll5e2pqmMEBIls0=' hash='sha-1'/>
              </presence>";

    // end vacuum vCard example

    // http://xmpp.org/extensions/xep-0084.html node and metadata example     

    $this->addIdHandler($id, 'upload_avatar_handler');

    // send the 1st packet
    $this->send($xml);                                                                                          

    $this->addIdHandler($id2, 'upload_avatar_handler');

    // send the 2nd packet
    $this->send($xml2);                                                                                         
}

protected function upload_avatar_handler($xml)
{
    switch ($xml->attrs['type']) 
    {
        case 'error':
            $this->event('upload_new_avatar', 'error');
        break;

        default:
            $this->event('upload_new_avatar', 'default');
        break;
    }
}

希望它有助于某人尝试做同样的事情!

答案 1 :(得分:-1)

没有。一旦你使用了move_uploaded_file),它就不再是临时目录了。这就是 MOVE 而不是 COPY 的原因。没有什么说你不能移动它,然后在以后的任何地方使用copy()操作,例如。

move_uploaded_file($_FILES['file']['tmp_name'], '/site/file1.txt');
copy('/site/file1.txt', '/size/other/dir/file2.txt');
etc...

它只是一个文件...只是因为你移动它并不意味着你不能再为其他东西再次触摸它。