Я хочу создать приложение 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-й вопрос: почему размер файла не отображается, когда я пробую его в браузере (когда отображается всплывающее окно с вопросом, хотите ли вы открыть или загрузить файл)? Чего-то не хватает в заголовках?
Заранее спасибо!