Android JAVA $_FILE возвращает пустые файлы размером более ~ 50 МБ

Проблема: при попытке загрузить файлы размером более ~ 50 Мб, $_FILES возвращает пустой массив.

Я пытаюсь изменить пределы на php (много комбинаций), но это бесполезно..

мой класс в Java:

    public void upload() throws Exception {

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(this.url);   

        try {

          FileBody bin = new FileBody(this.file);

          @SuppressWarnings("deprecation")
          MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
          reqEntity.addPart("file", bin);
          httppost.setEntity(reqEntity);

          System.out.println("Requesting : " + httppost.getRequestLine());
          ResponseHandler<String> responseHandler = new BasicResponseHandler();

          String responseBody = httpclient.execute(httppost, responseHandler);

          System.out.println("responseBody : " + responseBody);

        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        } catch (ClientProtocolException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          httpclient.getConnectionManager().shutdown();
        }
    }

мой код PHP для печати массива для респауна:

<?php
ini_set('file_uploads', 1);
ini_set('max_file_uploads', '9999999999M');
ini_set('post_max_size', '2000M');
ini_set('max_input_time', 3600);
ini_set('max_execution_time', 3600);


 print_r($_FILES);
?>

2 ответа

Решение

Вы можете попытаться добавить MIME-тип файла при создании FileBody. Например:

FileBody bin = new FileBody(this.file, "application/octect-stream");

Другое решение - использовать клиент HttpURLConnection, который проще в использовании и менее подвержен ошибкам. Также Google рекомендует использовать его для новых приложений.

Одна или другая сторона разрывает http-соединение, используемое действием POST.

Вы знаете, какая сторона (клиент или сервер)

Если вы не знаете, возможно, вам следует попытаться исключить сервер, используя CURL, чтобы сделать M-Multipart Post одного из ваших больших ( +50) файлов.

Вызовите CURL для загрузки и добавьте ключ -v для подробного журнала, чтобы вы могли проанализировать процесс.

Android POST action на файлах размером 50 - 100 мегабайт должен работать нормально.

Поскольку вы выполняете большие загрузки, вам нужен клиент, которому вы можете отправлять заголовки "ожидайте 100, продолжить" и где вы можете использовать кодирование передачи по частям вместе с потоком на стороне клиента, который может предоставлять данные в буфер, который обернут чем-то вроде byteArrayEntity

apache или nginX в конфигурации std должны справиться с этим. Если ваш php процесс заканчивается, возможно, вам нужно проверить phpinfo.

Другие вопросы по тегам