Почему аудиофайл не загружается на сервер?

Я разрабатываю андроид-приложение, которое записывает аудиофайл и отправляет его на хостинг по указанной ссылке. Хотя файл успешно создаётся, при попытке его отправить возникает ошибка: <b>Ответ: {"success":false,"message":"\u0424\u0430\u0439\u043b \u043d\u0435 \u0431\u044b\u043b \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044f."}</b> <br/> <br/> Могу ли я получить помощь с тем, чтобы корректно отправить файл на хостинг? Вот код приложения: <br/> <br/> <pre><code class="java">public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_AUDIO_PERMISSION_CODE = 200;
    private MediaRecorder mediaRecorder;
    private Uri audioUri;
    private Handler handler = new Handler();
    private static final String UPLOAD_URL = "https://site.net/recordingaudio/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Проверка разрешений
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.RECORD_AUDIO}, REQUEST_AUDIO_PERMISSION_CODE);
        } else {
            if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.Q) {
                try {
                    startRecording();
                } catch (FileNotFoundException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.Q)
    private void startRecording() throws FileNotFoundException {
       
  • 5 ноября 2024 г. 10:23
Ответы на вопрос 2
Чтобы решить проблему с загрузкой аудиофайла на сервер, нужно учесть несколько важных моментов в вашем коде и реализации отправки файла. Вот список того, что стоит проверить и поправить:

1. **Проверьте, создаётся ли файл корректно**: Убедитесь, что аудиофайл действительно создаётся и доступен для чтения. Вы можете использовать `File.exists()` и `File.canRead()`, чтобы убедиться, что файл не пустой и вы имеете к нему доступ.

2. **Корректные параметры запроса**: Проверьте, что вы отправляете файл с правильным именем поля и типа. Обычно название поля для файла должно соответствовать ожиданиям сервера. Например, если сервер ожидает `file`, убедитесь, что вы используете это именно так в коде.

3. **Проверьте код загрузки файла**: Вам необходимо написать метод для загрузки файла, используя `HttpUrlConnection`, `OkHttp`, или любой другой HTTP-клиент, который вы используете. Вот пример использования `OkHttp`:

```java
private void uploadAudioFile(File audioFile) {
    OkHttpClient client = new OkHttpClient();

    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", audioFile.getName(), RequestBody.create(audioFile, MediaType.parse("audio/*")))
            .build();

    Request request = new Request.Builder()
            .url(UPLOAD_URL)
            .post(requestBody)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }

            String responseData = response.body().string();
            Log.i("UploadResponse", responseData);
            // Обработка ответа
        }
    });
}
```

4. **Проверьте настройки CORS на сервере**: Если ваш сервер не настроен для обработки запросов с других источников (например, если он является REST API), вы можете столкнуться с проблемами при загрузке.

5. **Проверьте нажатие кнопки и вызов метода загрузки**: Убедитесь, что метод `uploadAudioFile()` вызывается после того, как файл успешно создан. Например:

```java
private void stopRecording() {
    mediaRecorder.stop();
    mediaRecorder.release();
    mediaRecorder = null;

    // Допустим, файл имени хранится в переменной audioUri
    uploadAudioFile(new File(audioUri.getPath()));
}
```

6. **Обработка ошибок на сервере**: Сообщение, которое вы получаете от сервера, может дать полезную информацию. Проверьте логи сервера, чтобы убедиться, что файл не был загружен по другой причине.

7. **Формат файла и ограничения**: Убедитесь, что формат вашего аудиофайла поддерживается сервером и что вы не превышаете лимиты по размеру файла, если они установлены.

Если все эти пункты проверены и исправлены, проблема с загрузкой аудиофайла должна быть решена.
Тут разные подходы  к тому как делаются запросы к серверу. 
Вы правильно поняли, что нужен класс посредник, который перекодирует в ожидаемый PHP от апача формат.
Но не разобрались с ним до конца.
С моей точке зрения проще на беке подстроиться к тому как java шлет данные.
$data_in = file_get_contents('php://input');
и уже с ними работать. Но это личное мнение, так как на PHP у меня опыта на 15 лет больше чем в яве
Похожие вопросы