3

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] が追加されたようです。

4

1 に答える 1

3

0A は改行の 16 進コードです。そのため、ファイルの実際の内容の前に 2 つの改行が追加されているように見えます。readfileのドキュメントを読むことから、 readfile 呼び出しを次で囲むことをお勧めします。

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

それを試して、まだ 2 つの 0A 文字があるかどうかを確認してください。

于 2013-04-26T12:13:13.993 に答える