Как загрузить файл в папку загрузок с именем файла от сервера?

Для загрузки файла в папку загрузок с именем файла от сервера в Android, вам понадобится использовать некоторые классы и методы из платформы Android. Вот примерный алгоритм, который позволит вам реализовать это:

1. Убедитесь, что у вас есть необходимые разрешения в файле AndroidManifest.xml. Вам понадобится разрешение на доступ к Интернету и разрешение на запись на устройство.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. Создайте класс, который будет отвечать за загрузку файла. Предлагаю назвать его DownloadManager.

public class DownloadManager {
    private static final int BUFFER_SIZE = 4096;

    public static void downloadFile(String url, String filePath) throws IOException {
        URL downloadUrl = new URL(url);
        HttpURLConnection connection = (HttpURLConnection) downloadUrl.openConnection();
        connection.setRequestMethod("GET");

        // Проверяем, что соединение успешно
        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            // Получаем информацию о файле с сервера
            String fileName = "";
            String disposition = connection.getHeaderField("Content-Disposition");
            String contentType = connection.getContentType();
            
            if (disposition != null) {
                // Проверяем, содержит ли заголовок Content-Disposition информацию о имени файла
                int index = disposition.indexOf("filename=");
                if (index > 0) {
                    fileName = disposition.substring(index + 10, disposition.length() - 1);
                }
            } else {
                // Если заголовок Content-Disposition не содержит информацию о имени файла,
                // используем имя файла из URL
                fileName = url.substring(url.lastIndexOf("/") + 1, url.length());
            }

            // Открываем потоки для чтения данных из сервера и записи данных в файл
            InputStream inputStream = connection.getInputStream();
            FileOutputStream outputStream = new FileOutputStream(filePath + File.separator + fileName);

            // Создаем буфер для считывания данных из потока
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            // Закрываем потоки
            outputStream.close();
            inputStream.close();
        } else {
            throw new IOException("Server returned HTTP code " + connection.getResponseCode());
        }
        connection.disconnect();
    }
}

3. Далее, можно использовать этот класс для загрузки файла. Например, создайте активность и добавьте следующий код в метод onCreate().

String downloadUrl = "https://example.com/file.zip";
String downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();

try {
    DownloadManager.downloadFile(downloadUrl, downloadsDir);
    Toast.makeText(this, "Файл успешно загружен", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(this, "Ошибка загрузки файла: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}

В этом примере, мы указываем URL-адрес файла для загрузки и папку загрузок с помощью метода Environment.getExternalStoragePublicDirectory(). Затем мы вызываем метод downloadFile(), который загружает файл и сохраняет его в указанную папку загрузок.

Обратите внимание, что этот код выполняет операцию загрузки в главном потоке, что может вызвать блокировку пользовательского интерфейса. Чтобы избежать этого, вы можете использовать класс AsyncTask или другой механизм асинхронного выполнения для выполнения загрузки файла в фоновом режиме.