Я пробовал разные коды для загрузки файлов с php.
fileread () дает проблемы так что это даже не вариант сейчас.
Сейчас я пытаюсь использовать fread (), но проблема в том, что при загрузке файла этот файл никогда не работает. Я загружаю сломанный файл. Например, если я скачаю файл изображения, он выдаст ошибку «Неверное изображение» в Picasa. (Показано ниже)
Ниже приведен код, который я использую:
<?php
require '../php/db.php'; // Database Connection (No issue in this)
ob_start();
set_time_limit(0); // To set script time to infinity.
ini_set('memory_limit', '512M');
if(isset($_GET['file_id'])&&!empty($_GET['file_id'])) download_file($_GET['file_id']); // calling a function download_file given below
else die("There was an error in downloading file. Please try again later.");
function download_file($id){
global $con; // For database connection
$id = mysqli_real_escape_string($con,htmlentities($id));
$file="SELECT file_name,file_title,file_size,down FROM files WHERE file_id= $id"; // Taking file info from database
$result = mysqli_query($con,$file);
if($result) echo "Okay!";
$row = mysqli_fetch_assoc($result);
$name = $row['file_name']; // File is stored with this name in same dir
$title = $row['file_title'];
$ext = ext($name);
$down = $row['down']; // Tells number of downloads
$newname = $title.'.'.$ext; // Changing file name while downloading.
$down++;
if(is_file($name)) {
$update_down = "UPDATE files SET down = $down WHERE file_id = '$id'";
$update_down_result = mysqli_query($con,$update_down); // Increment number of downloads
download_by_fread($name,$newname); // Calling a function
exit;
}else header("Location: ../index.php?msg=Sorry!+File+could+not+found!");
}
function download_by_fread($name,$newname){
if($fd=fopen($name, "rb")){
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-type: ".tell_file_type($name));
header("Content-Disposition: attachment; filename=\"".$newname."\"");
header("Content-length: ".filesize($name));
header("Cache-control: public"); //use this to open files directly
while(!feof($fd)) {
print(fread($fd, 4096));
ob_flush();
flush();
}
}else header("Location: ../index.php?msg=Sorry!+File+could+not+found!");
fclose($fd);
}
function ext($name){
$rut = strrev($name);
$erut = explode('.', $rut);
return strrev($erut[0]);
}
function tell_file_type($file_name){
$rut = strrev($file_name);
$erut = explode('.', $rut);
$ext = strrev($erut[0]);
switch($ext){
case 'txt': return 'text/plain'; break;
case 'rar':
case 'zip': return 'application/x-compressed'; break;
case 'gif': return 'image/gif'; break;
case 'jpg':
case 'jpeg': return 'image/jpeg'; break;
case 'bmp': return 'image/bmp'; break;
case 'png': return 'image/png'; break;
case 'pdf': return 'application/pdf'; break;
case 'mp3': return 'audio/mpeg3'; break;
case 'mp4': return 'video/mp4'; break;
case 'mkv': return 'video/mkv'; break;
case 'mpg': return 'video/mpeg'; break;
case 'avi': return 'video/avi'; break;
case 'wav': return 'audio/wav'; break;
case 'doc':
case 'docx': return 'application/msword'; break;
case 'pps':
case 'ppt':
case 'pptx': return 'application/mspowerpoint'; break;
case 'xls':
case 'xlsx': return 'application/excel'; break;
case 'exe': return 'application/octet-stream'; break;
case 'swf': return 'application/x-shockwave-flash'; break;
}
}
?>
Помогите мне найти ошибку в этом коде, пожалуйста.
Спасибо.
ОТВЕТ:
Я нашел ошибку. Я повторял «Хорошо!» после mysql_query. проверить успешность запроса. Мы можем сделать это, или он будет добавлен в файл. и файл станет недействительным.
Удалить ?>
от концов ваших файлов PHP, и убедитесь, что нет пробелов перед <?php
в начале.
Может случиться так, что PHP отправляет символы пробела на вывод изображения. Это может привести к повреждению файла, если за скобками PHP есть что-то, так как они будут автоматически отправляться в браузер как контент.
Других решений пока нет …