Скачать файл .apk из php с okhttp3 на Android - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу создать приложение Android, которое загружает файлы .apk (немного похоже на связанные с файлами, но не одинаковые) с моего сайта (работает apache2.4 и php 7.3) через асинхронный вызов okhttp. URL для тестирования только что вернул 1 файл, чтобы увидеть, работает ли он. Допустим, мой URL-адрес https://www.example.com/download.php Причина, по которой я хочу загружать файл вместо загрузки. php, а не просто https://www.example.com/myAwesomeApp.apk, заключается в том, что я не хочу, чтобы кто-либо мог просто скачайте мое приложение. Поэтому мой файл .apk находится вне / public_html / www / scope. Я поместил файл в /upperScope/myAwesomeApp.apk

Мой php код загрузки. php:

<?php
    $dl = dirname($_SERVER['DOCUMENT_ROOT']) . '/upperScope/'; # Outside the public web folder.
    $file = 'myAwesomeApp.apk'; // file not public
    $path = $dl . $file;

    if (file_exists($path)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.android.package-archive');
        header('Content-Disposition: attachment; filename="'.basename($path).'"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($path));
        readfile($path);
        exit;
    }
?>

Мой 1-й вопрос: вот как я настроил заголовки для обслуживания моего apk, или я должен добавить / изменить его, или я должен использовать другой подход?

2-й вопрос: я хочу, чтобы только зарегистрированные пользователи могли загружать приложение, поэтому после выполнения вызова okhttp в Android I Передайте имя пользователя и зашифрованный пароль в файл загрузки. php в ходе пост-звонка. Проверка входа работает, и я не включил ее здесь, потому что это выходит за рамки этих вопросов. Мой вопрос здесь заключается в том, что если я получу ответ и выполню следующий код в onResponse ()

String dloc =  getString(R.string.appDownloadLocation) + getString(R.string.myAppUpdateFolder);
String fileName = "app_update.apk";
String pathAndName = dloc + fileName;
File dlf = new File(Environment.getExternalStorageDirectory(), pathAndName);
dlf.getParentFile().mkdirs();
if (dlf != null){
   try {
        FileOutputStream fos = new FileOutputStream(dlf);
        fos.write(response.body().bytes());
        fos.close();
   } catch (IOException e) {
        e.printStackTrace();
   }
}

, будет ли FileOutputStream просто обрабатывать данные из объекта ответа или делать новый вызов? Поскольку файл создается, но его версия отсутствует, его размер равен 0,00 байтам, а имя пакета - нет, если я обращаю внимание на свойства файла. Если FileOutputStream действительно выполняет новый вызов для получения содержимого, записанного в файл, он может не получить содержимое, потому что, если будет задействован второй вызов, учетные данные не будут отправлены, что приведет к пустому файлу?

3-й вопрос: почему onResponse работает с абсолютным путем (https://www.example.com/myAwesomeApp.apk), а не с подходом /.download.php?

4-й вопрос: что будет лучшим подход, чтобы заставить его работать так, чтобы участник мог загрузить его только через /download.php, чтобы звонок не мог быть реплицирован, то есть одноразовая загрузка?

5-й вопрос: почему размер файла не отображается, когда я пробую его в браузере (когда отображается всплывающее окно с вопросом, хотите ли вы открыть или загрузить файл)? Чего-то не хватает в заголовках?

Заранее спасибо!

...