php - 上传sendfile文件作为附件并在php中下载该文件

标签 php mysql

我需要上传文件并将上传的文件作为附件发送到邮件中并从网页下载文件。文件的内容以mediumblob 数据类型存储在数据库中。上传文件并作为附件发送文件效果很好。当我下载文件内容时,其格式不可读。内容显示为

PD9waHANCg0KLy8gTWFrZSBhIE15U1FMIENvbm5lY3Rpb24NCiRob3N0PSJUZWthbGFkYi5kYi45
MTM1MTgyLmhvc3RlZHJlc291cmNlLmNvbSI7DQokdXNlcj0iVGVrYWxhZGIiOw0KJHBhc3N3b3Jk

这是代码

上传.php

<?php
session_start();
// Read POST request params into global vars
include_once "db.php";

$name1=mysql_real_escape_string(stripslashes($_POST['name1']));
$subject1=mysql_real_escape_string(stripslashes($_POST['subject1']));
$email1=$_POST['email1'];
$phone=$_POST['phone'];
$username=mysql_real_escape_string($_SESSION['sess_user4']);
  $to = "abc@gmail.com";
 $from=$_POST['email1'];
 $fileatt      = $_FILES['fileatt']['tmp_name'];
 $fileatt_type = $_FILES['fileatt']['type'];
 $fileatt_name = mysql_real_escape_string($_FILES['fileatt']['name']);
 $fileatt_size = $_FILES['fileatt']['size']; 
 $aa=filesize($fileatt);
$headers = "From: $from";
if (is_uploaded_file($fileatt)) {
  // Read the file to be attached ('rb' = read binary)
$name1=mysql_real_escape_string(stripslashes($_POST['name1']));
  $file = fopen($fileatt,'r');
  $content = fread($file,filesize($fileatt));


fclose($file);
$message="Name:$name1\n\n
          Email:$email1\n
          Subject:$subject1\n
          Phone No:$phone";
  // Generate a boundary string
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";


  // Add the headers for a file attachment
  $headers .= "\nMIME-Version: 1.0\n" .
              "Content-Type: multipart/mixed;\n" .
              " boundary=\"{$mime_boundary}\"";

  // Add a multipart boundary above the plain message
  $message = "This is a multi-part message in MIME format.\n\n" .
             "--{$mime_boundary}\n" .
             "Content-Type: text/html; charset=\"iso-8859-1\"\n" .
             "Content-Transfer-Encoding: 7bit\n\n" .
            stripslashes($message). "\n\n";

  // Base64 encode the file data
  $content = chunk_split(base64_encode($content));

  // Add file attachment to the message
  $message .= "--{$mime_boundary}\n" .
              "Content-Type: {$fileatt_type};\n" .
              " name=\"{$fileatt_name}\"\n" .
              //"Content-Disposition: attachment;\n" .
              //" filename=\"{$fileatt_name}\"\n" .
              "Content-Transfer-Encoding: base64\n\n" .
              $content . "\n\n" .
              "--{$mime_boundary}--\n";

}

// Send the message
$ok = @mail($to, $subject, $message, $headers);
if ($ok) {
   echo "<script>window.open('display.php','_self')</script>";
} else {
  echo "<p>Mail could not be sent. Sorry!</p>";
}
$query = "INSERT INTO register (name,type,size,content,name1,email1,subject1,phone,username) VALUES ('$fileatt_name','$fileatt_type','$fileatt_size','$content','$name1','$email1','$subject1','$phone','$username')";

mysql_query($query) or die('Error, query failed');  

?>

下载.php

   <html>
        <head>
            <title>Download File From MySQL Database</title>
            <meta http-equiv="Content-Type" content="text/html; 
                  charset=iso-8859-1">
        </head>
        <body>
        <?php
     include_once "db.php";
    if(isset($_GET['id'])) { // if id is set then get the file with the id from database
   $id = $_GET['id'];
 $content = chunk_split(base64_decode($content));
   $query = "SELECT name, type, size, content FROM register WHERE id = $id";
   $result = mysql_query($query) or die('Error, query failed');
   list($name, $type, $size, $content) = mysql_fetch_array($result);
   header("Content-length: $size");
   header("Content-type: $type");
   header("Content-Disposition: attachment; filename=$name");
   echo $content; exit;
   }
   $query = "SELECT id, name FROM register";
  $result = mysql_query($query) or die('Error, query failed');
  if(mysql_num_rows($result) == 0)
  {
   echo "Database is empty";
  }
  else
  {
   while(list($id, $name) = mysql_fetch_array($result)) 
   {
   ?> 
     <a href="download.php?id=<?php echo $id;?>"><?php echo $name; ?></a>
   <?php
    }
    }
    ?>
   </body>
    </html>

最佳答案

我认为问题出在已经设置的标题中。 试试这个代码:

<?php
include_once "db.php";
if (isset($_GET['id'])) { // if id is set then get the file with the id from database
    $id = $_GET['id'];
    $query = "SELECT name, type, size, content FROM register WHERE id = $id";
    $result = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);
    header("Content-length: $size");
    header("Content-type: $type");
    header("Content-Disposition: attachment; filename=$name");
    echo base64_decode(str_replace("\n", "", $content));
    exit;
} else {
?>
<html>
<head>
    <title>Download File From MySQL Database</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$query = "SELECT id, name FROM register";
$result = mysql_query($query) or die('Error, query failed');
if (mysql_num_rows($result) == 0) {
    echo "Database is empty";
}
else {
    while (list($id, $name) = mysql_fetch_array($result)) {
        ?>
        <a href="download.php?id=<?php echo $id; ?>"><?php echo $name; ?></a>
        <?php
    }
}
}
?>
</body>
</html>

关于php - 上传sendfile文件作为附件并在php中下载该文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739529/

相关文章:

php - 通过 CURL (php) 在 twilio 通知 API 中发送批量消息

mysql - 分析 cakephp 查找操作

python - 如果 MySQL 正在运行,如何在 ubuntu 上用 python 找出?

php - Android C2DM 缺少注册错误?

php - 将图像转换为预定义的 16 种颜色

php - 如何设置 Flow Play 器根据视频分辨率自动调整大小?

php - sql - 确定第一组记录

mysql - mysql中左连接时计算唯一值

jquery - 如何在asp.net(vb.net)中从母版页调用jquery

mysql - 加入同一列的 SQL 表