2013-03-25 2 views
2

Я пытаюсь загрузить файл APK Android, который выводится на странице php. Скачивание выполняется успешно, но проблема с пакетом парсов возникает при попытке установить файл apk. На самом деле, доступ к файловому пути (/var/www/xxx/HelloWorldTest.apk) напрямую, этот метод установлен полностью. (Без проблем.) Но я хочу использовать метод, который через источник php.загрузка Android-бинарного файла (apk) в php, анализ пакета ошибок при установке файла apk

У меня есть 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); 
?> 

Have HelloWorldTest (Android приложение) Manifest нравится:

<?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 (Final), 2.6.32-279.5.2.el6.x86_64, PHP 5.3.17 Таблица Android Версия: 3.2.1 версия ядра: 2.6.36.3

Существует разница b inary dump при использовании метода прямого доступа и использовании результата метода 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] был добавлен в двоичном коде.

ответ

2

0A - это шестнадцатеричный код для подачи строки. Таким образом, у вас есть два линейных канала, добавленных до фактического содержимого файла. От чтения документации на readfile, он рекомендует окружая ReadFile вызов со следующим:

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

Try, что и посмотреть, если вы все еще есть два 0A символов.