所以我将我的文件存储在数据库中。不要问为什么,只知道我无法控制这一点。接下来,我能够成功地将它们存储为十六进制表示,然后将它们吐回来显示没有问题,但随后我将它们附加到使用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);
所以这是三个步骤,我不确定错误的来源。希望有人可以提供帮助!感谢您提前获得所有帮助!