PHP无法将电子邮件附件上传到FTP服务器。

3

我一直在尝试将从IMAP电子邮件获取的附件上传到FTP服务器,以下是我的代码:

检索附件

<?php
    /* 
        attachedFile() returns the attachment already decoded.
        For this example the encode type was base64, so it used imap_base64 to decode 
    */
    function attachedFile($uid, $section, $encoding) {
        # Returns file as an encoded string
        $file = imap_fetchbody($this->conn, $uid, $section, FT_UID); 

        switch ($encoding) {
            case 0:
            case 1:
                $file = imap_8bit($file); break;
            case 2:
                $file = imap_binary($file); break;
            case 3:
                $file = imap_base64($file); break;
            case 4:
                $file = quoted_printable_decode($file); break;
        }
        $mime = imap_fetchmime($this->conn, $uid, $section, FT_UID);

        # returning decoding file, I use mime in another section
        return array('file' => $file, 'mime' => $mime);
    }

    /* 
        Returns file as stream using attached_file() returns
    */
    function streamedAttach( $filename, $uid, $section, $encoding ) {
        # Returns file as stream using attached_file() returns
        $attach = $this->attachedFile($uid, $section, $encoding);
        $attachment = $attach['file'];

        $stream = fopen($filename, 'w+');
        if ( $stream === false ) return false;

        $ok = fputs($stream, $attach['file']);

        # raw printing
        echo "Bytes: " . $ok . "<br />";

        if ($ok===false) return false;

        return $stream;
    }
?>

streamedAttach接收attached_file的返回值并将其写入'handler' $stream。

然后它发送该流。注意:我没有关闭流,因为当我关闭它时... ftp_fput失败了。所以我把它留着开着。

但是如果你看到这一行

echo "Bytes: " . $ok . "<br />";

它正在写入字节:

已写入的字节

这是上传到FTP的操作

function login($user, $pass) {
    $ok = $this->conn!==false;
    if ($ok) {
        # Credentials
        $this->user = $user; 
        $this->pass = $pass;

        $login = @ftp_login($this->conn, $this->user, $this->pass);
        $pasv = ftp_pasv($this->conn, true);

        $ok = ($login && $pasv);
    }
    return $ok;
}

function uploadStreamedFile($stream, $destination) {
    $ok = $this->conn!==false;
    if ($ok) {
        $ok = ftp_fput($this->conn, $destination, $stream, FTP_BINARY);
        fclose($stream);
    }
    return $ok;
}

现在,upload_streamed_file接收$stream并使用ftp_fput(因为它是指针)在服务器上创建一个文件...坏的是文件大小为0 KB。 服务器上的文件

这就是我调用它们的地方

$ftp = new ftp_conn();
$ftp->basePath = "POS_ARCHIVE";

# This is the same name as in the email
$filename = "th.jpg"; 

# Sample data
$uid = 18; 
$section = 2; 
$encode = 3;
$path = "POS_ARCHIVE/4700327771/$filename";

echo $filename . "<br />";

if ($ftp->login(FTP_UID, FTP_PWD)) {

        # $mailbox I have the instance before.
        $streamed = $mailbox->streamedAttach($filename, $uid, $section, $encode);
        $ok = $ftp->uploadStreamedFile($streamed, $path);
        if ( $ok ) echo "There you go!";
        else echo "Nope, nope.";
} else 
    echo "Nope, nope.";

你能帮我吗?我已经花了2个小时在这个问题上了...

1个回答

1
streamed_attach()返回时,流的文件指针指向文件末尾。因此,当您尝试使用ftp_fput()上传它时,它会立即读取EOF并上传空文件。您需要回到文件开头,以便可以读取您已写入文件的内容。
function upload_streamed_file( $stream, $destination ) {
   if ( $this->conn === false ) {
       return false; //Later I'll add more details of why not.
   } else {
       //error( $destination );
       rewind($stream);
       $ok = ftp_fput( $this->conn, $destination, $stream, FTP_BINARY );
       fclose( $stream );
       return $ok;
   }
}

另一种选择是在 streamed_attach() 中关闭流,然后使用文件名进行 ftp_put,而不是使用流进行 ftp_fput


成功了!就像你说的那样!我只是写了 rewind($stream); 然后在 fputs(); 之后它就起作用了!非常感谢你!我已经在考虑成为政治家或类似的东西哈哈。 - mariomenjr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接