用php和mysql上传的文件已损坏

ndh0cuux  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(466)

我需要上传和下载文件与php/mysql在我自己的小项目。
使用post通过表单上传文件,并按以下方式处理:

  1. <?
  2. $passName1 = $_FILES['passport1']['name'];
  3. $tmpName1 = $_FILES['passport1']['tmp_name'];
  4. $fileSize1 = $_FILES['passport1']['size'];
  5. $fileType1 = $_FILES['passport1']['type'];
  6. $fp1 = fopen($tmpName1, 'r');
  7. $pass_1_content = fread($fp1, filesize($tmpName1));
  8. fclose($fp1);
  9. ?>

然后我用这个函数上传它们:

  1. $passport1id = insert_user_file ($db, $passName1, $fileType1, $fileSize1, $pass_1_content);
  2. function insert_user_file ($db, $name, $type, $size, $content) {
  3. try {
  4. echo "<br>start insert file $name";
  5. $insertfile = new PDO("mysql:host=".$db['server'].";dbname=".$db['db'], $db['mysql_login'], $db['mysql_pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  6. // set the PDO error mode to exception
  7. $insertfile->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8. // prepare sql and bind parameters
  9. $stmt=$insertfile->prepare ("INSERT INTO files (name, size, type, content, created) VALUES (:name, :size, :type, :content, NOW())");
  10. $stmt->bindParam(":name", $name);
  11. $stmt->bindParam(":size", $size);
  12. $stmt->bindParam(":type", $type);
  13. $stmt->bindParam(":content", $content);
  14. $stmt->execute();
  15. $file_id = $insertfile->lastInsertId();
  16. return $file_id;
  17. }
  18. catch(PDOException $e) {
  19. echo 'error: '. $e->getMessage();
  20. return false;
  21. }
  22. }

文件名/内容中存在addslashes()似乎没有任何区别。似乎工作正常,但当我用下面的函数取回文件时,它似乎已损坏:

  1. get_file ($db, $_GET['id']);
  2. function get_file ($db, $fileid){
  3. try {
  4. $get_file = new PDO("mysql:host=".$db['server'].";dbname=".$db['db'], $db['mysql_login'], $db['mysql_pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  5. $get_file->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6. $file = $get_file->prepare("SELECT * FROM files where fileid=:fileid");
  7. $file->bindParam(":fileid", $fileid);
  8. $file->execute();
  9. $file_data = $file->fetch(PDO::FETCH_ASSOC);
  10. header('Content-Description: File Transfer');
  11. header('Content-Type: application/octet-stream');
  12. header('Content-Transfer-Encoding: binary');
  13. header('Connection: Keep-Alive');
  14. header('Expires: 0');
  15. header("Content-length: {$file_data['size']}");
  16. header("Content-type: {$file_data['type']}");
  17. header("Content-Disposition: attachment; filename={$file_data['name']}");
  18. echo $file_data['content'];
  19. exit;
  20. }
  21. catch(PDOException $e) {
  22. //echo 'error: '. $e->getMessage();
  23. return false;
  24. }
  25. }
6mzjoqzu

6mzjoqzu1#

我已经解决了这个问题!愚蠢的我,我应该把整个代码放在这里,因为它导致了混乱!

  1. <?php
  2. ob_start();
  3. session_start();
  4. require_once 'functions.php';
  5. /*
  6. if(!isset($_SESSION['logged']) OR $_SESSION['logged'] == false){
  7. header ("Location: index.php");
  8. exit;
  9. }
  10. */
  11. //somecode here
  12. //echo "logged in ok";
  13. get_file ($db, $_GET['id']);
  14. ?>

罪魁祸首在第2行ob_start();覆盖了如下警告:

  1. Warning: Cannot modify header information - headers already sent by (output started at /sata2/home/users//functions.php:289) in /sata2/home/users//functions.php on line 130

第289行后面有几个空格 ?> //some spaces were here 这是一个非常愚蠢的错误。非常感谢@marcb暗示我可能会错过一些警告。以后不要留下空白 ?>

展开查看全部

相关问题