2015-04-22 3 views
0

При использовании компьютерных файлов загружаются в обычном режиме. Проблема начинается с Android-браузеров.Невозможно скачать файлы с php в андроид-браузерах

Когда мы загружаем файл из браузера android по умолчанию, файл загружается, но он составляет 0,00 байт, поэтому технически отсутствует там (поврежденный файл).

При загрузке файла из любого стороннего приложения, например, или в опера, он дает ошибку, что «файл не может быть загружен». а не ошибка заголовка. И файлы могут быть загружены через браузер UC, Chrome и Firefox. Но все же дает ошибку в браузере по умолчанию.

Вот код, я использую:

<?php 
require 'php/db.php'; 
if(isset($_POST['file_id'])&&!empty($_POST['file_id'])){ 
    download_file($_POST['file_id']); 
} 
function download_file($id){ 
    global $con; 
    $id = mysqli_real_escape_string($con,htmlentities($id)); 
    $file="SELECT file_name,file_title,file_size,down FROM files WHERE file_id= $id"; 
    $result = mysqli_query($con,$file); 
    $row = mysqli_fetch_assoc($result); 
    $name = $row['file_name']; 
    $title = $row['file_title']; 
    $size = $row['file_size']; 
    $ext = strtoupper(ext($name)); // Function defined bellow 
    $down = $row['down']; 
    $newname = $title.'.'.$ext; 
    $olddir = "files/".$name; 
    $down++; 

    if(is_file($olddir)) { 
     $update_down = "UPDATE files SET down = $down WHERE file_id = '$id'"; 
     $update_down_result = mysqli_query($con,$update_down); 

     header('Pragma: public'); // required 
     header('Expires: 0');  // no cache 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($olddir)).' GMT'); 
     header('Cache-Control: private',false); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename="'.$newname.'"'); 
     header('Content-Transfer-Encoding: binary'); 
     header('Content-Length: '.$size); // provide file size 
     header('Connection: close'); 
     readfile($olddir); 

     exit(); 
    }else header("Location: index.php?msg=Sorry!+File+could+not+be+downloaded"); 

} 

function ext($name){ 
    $rut = strrev($name); 
    $erut = explode('.', $rut); 
    return strrev($erut[0]); 
} 

Дадим файл идентификатор этой функции, и он загружает файл на ПК.

Может ли кто-нибудь сказать мне, как удалить эту ошибку? Так что пользователи могут загружать файлы со своих телефонов Android.

+0

http://stackoverflow.com/questions/4674737/avoiding-content-type-issues-when-downloading-a-file-via-browser-on-android проверить этот вопрос, он предлагает положить расширение в столицах. – STLMikey

+0

напишите расширение имени файла Content-Disposition в UPPERCASE . Для этого я изменяю строку $ ext = strtoupper (ext ($ name)); и теперь, если мы загружаем расширение, оно поставляется в верхнем регистре, но все еще не может быть загружено на мобильный. Если вы хотите попробовать скачать файл с сайта www.skyshare.in – Paras

+0

Пожалуйста, разместите ссылку для скачивания здесь. – greenapps

ответ

0

Я получил решение. В основном я изменил две вещи:

  1. Используется метод GET вместо метода Post.
  2. Используются функции Flush и ob_clean для очистки буфера.

Нового код downfile.php как это:

<?php 
    require '../php/db.php'; 
    ob_start(); 
    if(isset($_GET['file_id'])&&!empty($_GET['file_id'])){ 
     download_file($_GET['file_id']); 
    }else die("There was an error in downloading file. Please try again later."); 

    function download_file($id){ 
     global $con; 
     $id = mysqli_real_escape_string($con,htmlentities($id)); 

     $file="SELECT file_name,file_title,file_size,down FROM files WHERE file_id= $id"; 
     $result = mysqli_query($con,$file); 
     $row = mysqli_fetch_assoc($result); 
     $name = $row['file_name']; 
     $title = $row['file_title']; 
     $ext = ext($name); 
     $down = $row['down']; 
     $newname = $title.'.'.$ext; 
     $size = $row['file_size']; 
     $down++; 

     if(is_file($name)) { 
      $update_down = "UPDATE files SET down = $down WHERE file_id = '$id'"; 
      $update_down_result = mysqli_query($con,$update_down); 

      header('Content-Description: File Transfer'); 
      header('Content-Type: application/octet-stream'); 
      header('Content-Disposition: attachment; filename="'.$newname.'"'); 
      header('Content-Transfer-Encoding: binary'); 
      header('Expires: 0'); 
      header('Cache-Control: must-revalidate'); 
      header('Pragma: public'); 
      header('Content-Length: '.$size); 
      ob_clean(); 
      flush(); 
      readfile($name); 
      exit; 

     }else header("Location: index.php?msg=Sorry!+File+could+not+found!"); 

    } 

    function ext($name){ 
     $rut = strrev($name); 
     $erut = explode('.', $rut); 
     return strrev($erut[0]); 
    } 

?> 

С помощью этого кода я могу загрузить файлы в андроиде браузеров тоже.

Надеюсь, это поможет. :)

0

Возможно, $ size == 0;

$size = $row['file_size']; 
... 
$olddir = "files/".$name; 

изменение

$olddir = "files/".$name; 
$size = filesize($olddir); 

И изменить

else header("Location: index.php?msg=Sorry!+File+could+not+be+downloaded"); 

в

else header("Location: index.php?msg=Sorry!+File+could+not+be+found+on+server: " . $olddir); 
+0

Все еще не работает. Я изменил свой код, как вы предложили. но нет. Та же проблема. – Paras

+0

Ваш код с изменениями, которые я предложил, отлично работает на моем сервере. Но я использую запрос GET. Вы можете попробовать это тоже как тест. – greenapps

+0

Вы можете подготовить свой сценарий для POST и GET, просто добавив 'if (isset ($ _ GET ['file_id']) &&! Empty ($ _ GET ['file_id']) { download_file ($ _ GET ['file_id' ]); ' – greenapps

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