2015-05-15 6 views
1

Я пробовал разные коды для загрузки файлов с php.Ошибка: Загрузка файла с ошибкой по php

fileread() дает проблемы так что это даже не вариант.

Теперь я пытаюсь использовать fread(), но проблема, которую он дает, заключается в том, что при загрузке файла этот файл никогда не работает. Я загружаю разбитый файл. Например, если я загружаю файл изображения, он выдаст ошибку Неправильное изображение в picasa. (Показано ниже)

Broken file after downloading

Ниже приводится код, я использую:

<?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. чтобы проверить успешность запроса. Мы можем это сделать или добавить в файл. и файл станет недействительным.

+1

В вашем коде должно быть несколько пустых строк. В этом файле также могут быть пробелы в файле ./php/db.php. –

+0

пустые строки? Я не понимаю. и db.php - для подключения к базе данных. он связан без каких-либо проблем. Счетчик также обновляется должным образом. Основная проблема заключается в загрузке файла. – Paras

+1

некоторые пробелы/линии будут на странице. вы можете проверить это, просто изменив экстенсивность вашего файла изображения на .txt и откройте его в каком-то редакторе, вы найдете несколько пустых строк поверх своего кода, если вы удалите эти строки и сохраните и снова измените расширение изображения будет работать –

ответ

1

Удалите ?> с концов ваших файлов PHP и убедитесь, что в начале нет <?php.

Что может случиться, так это то, что PHP отправляет символы пробела на выход изображения. Это может привести к поврежденному файлу, если есть что-либо за пределами скобок PHP, поскольку они будут автоматически отправлены в браузер в качестве содержимого.

+0

Я нашел проблему. Я был эхом «Хорошо!» после mysql_query. чтобы проверить успешность запроса. – Paras

+0

Я рад, что вы все разобрались :) –

Смежные вопросы