2015-05-05 3 views
-1

У меня есть этот код с одного из сайтов для загрузки файлов. Внедрил этот код, но он загружается, но когда я пытался просмотреть файл, он показывает мне ошибку в файле. Я загрузил различные форматы файлов, такие как pdf, docx, doc, но он всегда показывал ошибку. Я сохранил свои загрузки или файл в базе данных. Его не в каталоге. Пожалуйста, предложите мне несколько идей по этому поводу.Файл поврежден при загрузке

ошибка является -

Предупреждение: Еореп (файлы/JAVAPROGRAMS.doc) [function.fopen]: не удалось не удалось открыть поток: Нет такого файла или каталога в C: \ wamp \ www \ pages \ кандидат \ download.php в строке Ошибка - не удается открыть файл.

mysql_connect('localhost','root','') or die(mysql_error()); 
//echo "connected"; 
mysql_select_db('talent') or die(mysql_error()); 
function output_file($file, $name, $mime_type='') 
{ 

$size = filesize($file); 
$name = rawurldecode($name); 
$known_mime_types=array(
"htm" => "text/html", 
"exe" => "application/octet-stream", 
"zip" => "application/zip", 
"doc" => "application/msword", 
"jpg" => "image/jpg", 
"php" => "text/plain", 
"xls" => "application/vnd.ms-excel", 
"ppt" => "application/vnd.ms-powerpoint", 
"gif" => "image/gif", 
"pdf" => "application/pdf", 
"txt" => "text/plain", 
"html"=> "text/html", 
"png" => "image/png", 
"jpeg"=> "image/jpg" 
); 

if($mime_type==''){ 
$file_extension = strtolower(substr(strrchr($file,"."),1)); 
if(array_key_exists($file_extension, $known_mime_types)){ 
    $mime_type=$known_mime_types[$file_extension]; 
} 
else 
{ 
     $mime_type="application/force-download"; 
}; 
}; 

    //turn off output buffering to decrease cpu usage 
    @ob_end_clean(); 

    // required for IE, otherwise Content-Disposition may be ignored 
    if(ini_get('zlib.output_compression')) 
    ini_set('zlib.output_compression', 'Off'); 
    header('Content-Type: ' . $mime_type); 
    header('Content-Disposition: attachment; filename="'.$name.'"'); 
    header("Content-Transfer-Encoding: binary"); 
    header('Accept-Ranges: bytes'); 

// multipart-download and download resuming support 
if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
    list($range) = explode(",",$range,2); 
    list($range, $range_end) = explode("-", $range); 
    $range=intval($range); 
    if(!$range_end) 
    { 
    $range_end=$size-1; 
    } 
    else 
    { 
    $range_end=intval($range_end); 
    } 

    $new_length = $range_end-$range+1; 
    header("HTTP/1.1 206 Partial Content"); 
    header("Content-Length: $new_length"); 
    header("Content-Range: bytes $range-$range_end/$size"); 
    } 
    else 
{ 
    $new_length=$size; 
    header("Content-Length: ".$size); 
} 

    /* Will output the file itself */ 
$chunksize = 1*(1024*1024); //you may want to change this 
$bytes_send = 0; 
if ($file = fopen($file, 'r')) 
{ 
    if(isset($_SERVER['HTTP_RANGE'])) 
    fseek($file, $range); 

    while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length)) 
    { 
    $buffer = fread($file, $chunksize); 
    echo($buffer); 
    flush(); 
    $bytes_send += strlen($buffer); 
} 
fclose($file); 
} else 

//If no permissiion 
die(mysql_error()); 
//die 
die(); 
} 
//Set the time out 
set_time_limit(0); 

//path to the file 
$file_path='files/'.$_REQUEST['filename']; 


//Call the download function with file path,file name and file type 
output_file($file_path, ''.$_REQUEST['filename'].'', 'text/plain'); 
+0

Этот код работает только с файлами в файловой системе, вам необходимо переписать этот код для работы с SQL-db. –

+1

Сценарий, который вы опубликовали, читает файл из файловой системы. Ошибка указывает, что файл не найден. Вы должны дать сценарию правильный путь. Если вы сохранили файл в базе данных, вам необходимо предоставить код для его получения. Я этого не вижу. –

+0

@AndriyStruk ... можете ли вы предложить мне, как бы я этого достичь ... все мои файлы находятся в db ... Мне просто нужно скачать его и просмотреть. Спасибо – Roshan

ответ

0

Попробуйте это. Просто укажите правильный путь к файлу. Надеюсь, это сработает для вас.

ignore_user_abort(true); 
set_time_limit(0); // disable the time limit for this script 

$path = "/YOUR_FILE_PATH/"; // change the path to fit your websites document structure 
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\].]|[\.]{2,})", '',$_GET['download_file']); // simple file name validation 
$dl_file = filter_var($dl_file, FILTER_SANITIZE_URL); // Remove (more) invalid characters 
$fullPath = $path.$dl_file; 

if ($fd = fopen ($fullPath, "r")) { 
$fsize = filesize($fullPath); 
$path_parts = pathinfo($fullPath); 
$ext = strtolower($path_parts["extension"]); 
switch ($ext) { 
       case "pdf": 
          header("Content-type: application/pdf"); 
          header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a file download 
    break; 
    // add more headers for other content types here 
    default; 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    break; 
} 
header("Content-length: $fsize"); 
header("Cache-control: private"); //use this to open files directly 
while(!feof($fd)) { 
    $buffer = fread($fd, 2048); 
    echo $buffer; 
} 
} 
fclose ($fd); 
exit; 
+0

Просто какая-то модификация и ее работа. fopen ($ _ FILES ["UploadFileName"] ["tmp_name"], 'r')) и добавлено -> header ("Content-Length:" .filesize ($ filePath)); – Roshan

+0

@ Рошан .. Похоже, если это сработает для вас. – vinod

-1

Попробуйте

output_file($file_path, ''.$_REQUEST['filename'].'', ''); 
+0

@MadhuriPhaltane ... это последняя строка в моем коде, где мне нужно поставить это. – Roshan

+0

Да. Вместо того, чтобы поместить параметр 'text/plain', который будет пустым, будет загружен файл doc. Здесь вы принудительно загружаете файл. Может быть, это дело. –

+0

@ MadhuriPhaltane .. Я использовал приведенный выше код ... но его выдавал ту же ошибку. Не удалось открыть поток. – Roshan

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