PDF数据库中的文件不断损坏

时间:2015-10-27 16:05:17

标签: php sql-server phpmailer

所以我将我的文件存储在数据库中。不要问为什么,只知道我无法控制这一点。接下来,我能够成功地将它们存储为十六进制表示,然后将它们吐回来显示没有问题,但随后我将它们附加到使用PHPMailer的电子邮件中,并且它们正确地使用正确的名称发送,但它们已损坏。我将逐步引导您完成下面的步骤,以便您确切知道它是如何存储的,这可以帮助我调试我的问题。 (请注意,所有代码都是为了节省空间而只是显示需要的内容)

第1步

抓取然后处理文件

$name = $_FILES['file_data']['name'];
$file = prepareImageDBString($_FILES['file_data']['tmp_name']);
$mime_type = $_FILES['file_data']['type'];

存储名称,文件和mime_type

这是函数prepareImageDBString()

function prepareImageDBString($filepath){
    $out = 'null';
    $handle = @fopen($filepath, 'r');
    if($handle){
        $content = @fread($handle, filesize($filepath));
        $content = bin2hex($content);
        @fclose($handle);
        $out = $content;
    }
    return $out;
}

第2步

在查看文件时,我将其显示为嵌入对象。这个文件很小,所以我只发布了整个代码。请注意,此处显示的文件没有任何问题。

$q = "SELECT lease_doc_file_data FROM lease_doc_file WHERE lease_doc__id ='".$_GET['id']."'";
$file = "";
foreach($CONN->query($q) as $row){
    $file = $row['lease_doc_file_data'];
}
if(!empty($file)){

    header("Content-type: application/pdf");
    ob_clean();
    flush();
    echo hextobin($file);
}

这是函数hextobin()

function hextobin($hexstr){ 
    $n = strlen($hexstr); 
    $sbin = "";   
    $i = 0; 
    while($i < $n){       
        $a = substr($hexstr,$i,2);           
        $c = pack("H*", $a); 
        if ( $i == 0 ){ $sbin = $c; } 
        else { $sbin .= $c;} 
        $i += 2; 
    } 
    return $sbin; 
}

第3步

最后,我将其作为邮件发送给我的部分。

$q = "SELECT lease_doc_file_data, lease_doc_file_name, lease_doc_file_type FROM lease_doc_file WHERE lease_doc__id ='$id'";
$file_data = "";
$file_name = "";
$file_type = "";
foreach($CONN->query($q) as $row){
    $file_data = $row['lease_doc_file_data'];
    $file_name = $row['lease_doc_file_name'];
    $file_type = $row['lease_doc_file_type'];
}
$file_data = hextobin($file_data);
$mail->AddStringAttachment($file_data, $file_name, 'binary', $file_type);

所以这是三个步骤,我不确定错误的来源。希望有人可以提供帮助!感谢您提前获得所有帮助!

0 个答案:

没有答案