无法在 android 浏览器中使用 php 下载文件

Posted

技术标签:

【中文标题】无法在 android 浏览器中使用 php 下载文件【英文标题】:Not able to download files with php in android browsers 【发布时间】:2015-06-30 11:14:09 【问题描述】:

使用电脑时文件下载正常。 安卓浏览器出现问题。

当我们从 android 默认浏览器下载文件时,该文件已下载但它是 0.00 字节,因此技术上不存在(损坏的文件)。

当我们从任何第三方应用程序(例如或 Opera)下载文件时,会出现“无法下载文件”的错误。不是标题错误。文件可以通过 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]);

我们给这个函数提供文件id,它会在PC上下载文件。

谁能告诉我如何消除错误?这样用户也可以从他们的安卓手机下载文件。

【问题讨论】:

***.com/questions/4674737/… 查看这个问题,它建议将扩展名放在大写字母中。 以大写形式写入 Content-Disposition 文件扩展名,为此我更改了 $ext = strtoupper(ext($name));现在,如果我们下载扩展程序以大写形式出现,但仍然无法在移动设备中下载。如果您想尝试,请从 www.skyshare.in 下载文件 请在此处发布下载链接。 r or opera it gives error that file could not be downloaded.。你的意思是他们显示这条消息:else header("Location: index.php?msg=Sorry!+File+could+not+bue+downloaded"); We give file id to this function。请展示你是如何做到的。您忘记告诉您的脚本名称是 downfile.php,并且当单击“下载”按钮之一时,浏览器应该向您的脚本发布 file_id 值。 【参考方案1】:

可能 $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);

【讨论】:

还是不行。我按照您的建议更改了代码。但不是。有同样的问题。 您的代码与我建议的更改在我的服务器上完美运行。但我使用 GET 请求。你也可以试试看。 您可以通过添加if(isset($_GET['file_id'])&amp;&amp;!empty($_GET['file_id'])) download_file($_GET['file_id']);为 POST 和 GET 准备脚本 如果你这样做了,你也可以在这里发布一个获取链接,这样每个人都可以测试并看到它。喜欢skyshare.in/downfile.php?file_id=75【参考方案2】:

我得到了解决方案。 主要是我改了两点:

    使用 GET 方法而不是 Post 方法。 使用 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]);
    

?>

通过这段代码,我也可以在安卓浏览器中下载文件。

希望这可能会有所帮助。 :)

【讨论】:

以上是关于无法在 android 浏览器中使用 php 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Android 使用 php 在浏览器中打开 pdf 文件

使用php下载文件时无法浏览网站

php文件在浏览器中无法直接打开

无法检测从android发送的php中的Post参数

PHP rest api如何返回文件或下载

单域PHP版本变更|浏览器下载