在php中下载Android二进制文件(apk),在安装apk文件时解析错误包

时间:2013-03-25 04:50:08

标签: php parsing download install apk

我正在尝试下载由php页面输出的Android APK文件。 下载是成功的,但尝试安装apk文件时会发生解析包问题。 实际上,直接访问文件路径(/var/www/xxx/HelloWorldTest.apk),这个方法完全安装。(没问题。) 但我想使用通过php源的方法。

我的服务器上有Android应用程序,并且还有如下代码的PHP代码:

<?php
$path = "/var/www/xxx/";
$filename="HelloWorldTest.apk";
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: application/vnd.android.package-archive");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($path . $filename));
readfile($path . $filename);
?>

拥有HelloWorldTest(Android应用)表现如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworldtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.helloworldtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我的设置: CentOS版本6.3(最终版),2.6.32-279.5.2.el6.x86_64,PHP 5.3.17 Android表版本:3.2.1内核版本:2.6.36.3

使用直接访问方法和使用php方法结果存在二进制转储的差异。

直接访问(成功)

50 4B 03 04 14 00 08 08  08 00 F5 91 76 42 00 00 
00 00 00 00 00 00 00 00  00 00 1C 00 04 00 72 65 
73 2F 6C 61 79 6F 75 74  2F 61 63 74 69 76 69 74 
79 5F 6D 61 69 6E 2E 78  6D 6C FE CA 00 00 6D 91
...

通过php(安装失败)

0A 0A 50 4B 03 04 14 00  08 08 08 00 F5 91 76 42 
00 00 00 00 00 00 00 00  00 00 00 00 1C 00 04 00 
72 65 73 2F 6C 61 79 6F  75 74 2F 61 63 74 69 76 
69 74 79 5F 6D 61 69 6E  2E 78 6D 6C FE CA 00 00
.....

问题似乎是初始部分[0A 0A]以二进制代码添加。

1 个答案:

答案 0 :(得分:2)

0A是换行的十六进制代码。因此,您似乎在文件的实际内容之前添加了两个换行符。通过阅读readfile上的文档,它建议使用以下内容包围readfile调用:

ob_clean();
flush();
readfile($path . $filename);
exit;

尝试一下,看看你是否还有两个0A字符。