繁体   English   中英

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

[英]PHP unable to upload emails attachments to ftp server

我一直在尝试将从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接收attach_file的返回并写入'handler'$ stream。

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

但是,如果你看到这一行

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

它是写字节:

BYTES写的

这是上传到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个小时了...

streamed_attach()返回时, 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;
   }
}

另一种方法是在ftp_put streamed_attach()关闭流,然后使用ftp_put和文件名而不是ftp_fput与流。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM